web-dev-qa-db-ja.com

ファイルがディレクトリか単なるファイルかを確認する

何かがファイルかディレクトリかをチェックするプログラムを書いています。これよりも良い方法はありますか?

#include <stdio.h>

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int isFile(const char* name)
{
    DIR* directory = opendir(name);

    if(directory != NULL)
    {
     closedir(directory);
     return 0;
    }

    if(errno == ENOTDIR)
    {
     return 1;
    }

    return -1;
}

int main(void)
{
    const char* file = "./testFile";
    const char* directory = "./";

    printf("Is %s a file? %s.\n", file,
     ((isFile(file) == 1) ? "Yes" : "No"));

    printf("Is %s a directory? %s.\n", directory,
     ((isFile(directory) == 0) ? "Yes" : "No"));

    return 0;
}
27
Jookia

stat() 関数を呼び出し、 stat 構造体の_st_mode_フィールドでS_ISREG()マクロを使用して、パスは通常のファイルを指します:

_#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int is_regular_file(const char *path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISREG(path_stat.st_mode);
}
_

regulardirectory以外にもデバイスのような他のファイルタイプがあることに注意してください、パイプ、シンボリックリンク、ソケットなど。これらを考慮することもできます。

51

使用 S_ISDIRmacro:

int isDirectory(const char *path) {
   struct stat statbuf;
   if (stat(path, &statbuf) != 0)
       return 0;
   return S_ISDIR(statbuf.st_mode);
}
18
ismail

はい、あります。 statまたはfstat関数を確認します

4
KARASZI István

通常、結果を使用してこのチェックをアトミックに実行するため、 stat() は無用です。代わりに、 open() 読み取り専用ファイルを最初に使用し、 fstat() を使用します。ディレクトリの場合、 fdopendir() を使用して読み取ることができます。または、最初から書き込み用に開いてみると、ディレクトリの場合は開くことができません。一部のシステム(POSIX 2008、Linux)には、openの_O_DIRECTORY_拡張もあり、名前がディレクトリでない場合、呼び出しが失敗します。

opendir() を使用したメソッドもディレクトリが必要な場合に適していますが、後で閉じないでください。先に進んで使用する必要があります。

1
R..