ファイルがディレクトリ、リンク、または単なる通常のファイルであるかどうかを確認したいと思います。ディレクトリをループして、各ファイルをとして保存しますstruct dirent *
。、、、またはに渡そうとしd_ino
ますが、ファイルに関係なく、肯定的な結果は得られません。だから私の質問は:私はどのように使用するのですか?S_ISDIR(m)
S_ISLINK(m)
S_ISREG(m)
S_ISDIR(m)
struct dirent
3 に答える
を使用してディレクトリを読み取るreaddir(3)
と、ファイルの種類は、メンバーではなく、受け取ったd_type
それぞれのメンバー変数に格納されます。inode 番号を気にすることはめったにありません。struct dirent
d_ino
ただし、すべての実装がメンバーの有効なデータを持っているわけではないため、ファイルの種類を判別するために各ファイルに対してまたはd_type
を呼び出す必要がある場合があります (シンボリック リンクに関心がある場合は使用し、のターゲットに関心がある場合は使用します)。シンボリック リンク) を作成し、マクロを使用してメンバーを調べます。stat(3)
lstat(3)
lstat
stat
st_mode
S_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);
S_ISDIR(m)、S_ISLINK(m) はstruct stat.st_mode
、 ではなくに対して使用されstruct dirent
ます。例えば:
struct stat sb;
...
stat ("/", &sb);
printf ("%d", S_ISDIR (sb.st_mode));
残念ながら、上で述べたように、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.