74

C で Linux にディレクトリが存在するかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

96

失敗したかどうかを使用opendir()して確認できます。ENOENT == errno

#include <dirent.h>
#include <errno.h>

DIR* dir = opendir("mydir");
if (dir) {
    /* Directory exists. */
    closedir(dir);
} else if (ENOENT == errno) {
    /* Directory does not exist. */
} else {
    /* opendir() failed for some other reason. */
}
于 2012-09-20T10:38:31.520 に答える
17

stat()のアドレスを使用して渡しstruct stat、そのメンバーst_modeS_IFDIR設定されているかどうかを確認します。

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

...

char d[] = "mydir";

struct stat s = {0};

if (!stat(d, &s))
  printf("'%s' is %sa directory.\n", d, (s.st_mode & S_IFDIR)  : "" ? "not ");
  // (s.st_mode & S_IFDIR) can be replaced with S_ISDIR(s.st_mode)
else
  perror("stat()");
于 2012-09-20T10:44:13.567 に答える
11

最善の方法は、たとえば、たとえばを使用して、おそらくそれを開こうとすることopendir()です。

ファイルシステム リソースを使用してみて、それが存在しないために発生したエラーを処理することが常に最善であることに注意してください。後者のアプローチには明らかな競合状態があります。

于 2012-09-20T10:38:23.767 に答える
4

man(2)statによると、st_mode フィールドで S_ISDIR マクロを使用できます。

bool isdir = S_ISDIR(st.st_mode);

補足として、ソフトウェアが他の OS でも実行できる場合は、Boost や Qt4 を使用してクロスプラットフォームのサポートを容易にすることをお勧めします。

于 2014-01-15T22:45:24.180 に答える
4

accessと組み合わせて使用​​しopendirて、ディレクトリが存在するかどうか、および名前は存在するがディレクトリではないかどうかを判断することもできます。例えば:

#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (const char *d)
{
    DIR *dirptr;

    if (access ( d, F_OK ) != -1 ) {
        // file exists
        if ((dirptr = opendir (d)) != NULL) {
            closedir (dirptr); /* d exists and is a directory */
        } else {
            return -2; /* d exists but is not a directory */
        }
    } else {
        return -1;     /* d does not exist */
    }

    return 1;
}
于 2014-07-03T03:33:16.163 に答える