6

opendir() を使用してディレクトリを開き、次に readdir() と lstat() を使用してそのディレクトリ内の各ファイルの統計を取得します。このマンページに従って、思ったように動作しないコードを書きました。現在のディレクトリ内のすべてのファイルを一覧表示しますが、ファイルが通常のファイル、シンボリック リンク、またはディレクトリのいずれであるかは出力されません。

#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>

void main(){

    char* folder=".";                                     //folder to open

    DIR* dir_p;
    struct dirent* dir_element;
    struct stat file_info;

    // open directory
    dir_p=opendir(folder);

    // show some info for each file in given directory
    while(dir_element = readdir(dir_p)){

        lstat(dir_element->d_name, &file_info);          //getting a file stats

        puts(dir_element->d_name);                       // show current filename
        printf("file mode: %d\n", file_info.st_mode);

        // print what kind of file we are dealing with
        if (file_info.st_mode == S_IFDIR) puts("|| directory");
        if (file_info.st_mode == S_IFREG) puts("|| regular file");
        if (file_info.st_mode == S_IFLNK) puts("|| symbolic link");
    }

}
4

3 に答える 3

6

私はそれが何年も後のことを知っていますが、後世のためにあなたはそれを間違っていました:
@alkは正しかったst_modeフィールドには、ファイルタイプ、ファイルのアクセス許可などの詳細情報が含ま
れています。 S_IFMT .次に、必要なものの結果を確認します。それが、@Ernest Friedman-Hillが言及したマクロです。 スイッチは、包括的なチェック、つまり単純なケースに適しています。

     if ((file_info.st_mode & S_IFMT)==S_IFDIR) puts("|| directory");

包括的なチェックのために:

       struct stat st;
       ...

      switch (st.st_mode & S_IFMT) {
        case S_IFREG:  
            puts("|| regular file");
            break;
        case S_IFDIR:
            puts("|| directory");
            break;
        case S_IFCHR:        
            puts("|| character device");
            break;
        case S_IFBLK:        
            puts("|| block device");
            break;
        case S_IFLNK: 
            puts("|| symbolic link");
            break;
        case S_IFIFO: 
            puts("|| pipe");    
            break;
        case S_IFSOCK:
            puts("|| socket");
            break;
        default:
            puts("|| unknown"); 
     }
于 2016-03-14T00:34:06.177 に答える
5

解釈するマクロのセットがありますがst_mode、これは想像以上に複雑です。フィールドを直接プローブする代わりにそれらを使用します。

if (S_ISREG(file_info.st_mode))
    // file is a regular file
else if (S_ISLNK(file_info.st_mode))
    // ...

S_ISDIR、 、その他いくつかありS_ISSOCKます。たとえば、情報についてはこちらを参照してください。

于 2011-10-06T12:42:22.777 に答える
2

モードには多くの情報が含まれています。

次の種類のテストを試してください。

if (S_ISDIR(file_info.st_mode))  puts("|| directory");
于 2011-10-06T12:37:00.883 に答える