3

ファイルがディレクトリ、リンク、または単なる通常のファイルであるかどうかを確認したいと思います。ディレクトリをループして、各ファイルをとして保存しますstruct dirent *。、、、またはに渡そうとしd_inoますが、ファイルに関係なく、肯定的な結果は得られません。だから私の質問は:私はどのように使用するのですか?S_ISDIR(m)S_ISLINK(m)S_ISREG(m)S_ISDIR(m)struct dirent

4

3 に答える 3

9

を使用してディレクトリを読み取るreaddir(3)と、ファイルの種類は、メンバーではなく、受け取ったd_typeそれぞれのメンバー変数に格納されます。inode 番号を気にすることはめったにありません。struct direntd_ino

ただし、すべての実装がメンバーの有効なデータを持っているわけではないため、ファイルの種類を判別するために各ファイルに対してまたはd_typeを呼び出す必要がある場合があります (シンボリック リンクに関心がある場合は使用し、のターゲットに関心がある場合は使用します)。シンボリック リンク) を作成し、マクロを使用してメンバーを調べます。stat(3)lstat(3)lstatstatst_modeS_IS***

典型的なディレクトリ反復は次のようになります。

// Error checking omitted for expository purposes
DIR *dir = opendir(dir_to_read);
struct dirent *entry;

while((entry = readdir(dir)) != NULL)
{
    struct stat st;
    char filename[512];
    snprintf(filename, sizeof(filename), "%s/%s", dir_to_read, entry->d_name);
    lstat(filename, &st);

    if(S_ISDIR(st.st_mode))
    {
        // This directory entry is another directory
    }
    else if(S_ISLINK(st.st_mode))
    {
        // This entry is a symbolic link
    }
    else if(S_ISREG(st.st_mode))
    {
        // This entry is a regular file
    }
    // etc.
}

closedir(dir);
于 2012-04-29T21:40:26.570 に答える
0

S_ISDIR(m)、S_ISLINK(m) はstruct stat.st_mode、 ではなくに対して使用されstruct direntます。例えば:

struct stat sb;
...
stat ("/", &sb);
printf ("%d", S_ISDIR (sb.st_mode));
于 2012-04-29T21:28:49.647 に答える
0

残念ながら、上で述べたように、struct dirent メンバーで S_IS* マクロを使用することはできません。ただし、メンバー d_type には既にその情報があるため、その必要はありません。次のように直接テストできます。

struct dirent someDirEnt;
... //stuff get it filled out
if(someDirEnt.d_type==DT_LNK)
...//whatever you link

特に、d_type メンバーには以下が含まれる場合があります。

   DT_BLK      This is a block device.
   DT_CHR      This is a character device.
   DT_DIR      This is a directory.
   DT_FIFO     This is a named pipe (FIFO).
   DT_LNK      This is a symbolic link.
   DT_REG      This is a regular file.
   DT_SOCK     This is a UNIX domain socket.
   DT_UNKNOWN  The file type is unknown.
于 2013-01-30T15:53:53.297 に答える