C で Linux にディレクトリが存在するかどうかを確認するにはどうすればよいですか?
質問する
145295 次
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_mode
がS_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 に答える