CのLinuxにディレクトリが存在するかどうかを確認するにはどうすればよいですか?
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. */
}
次のコードを使用して、フォルダーが存在するかどうかを確認します。 WindowsおよびLinuxプラットフォームの両方で動作します。
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
const char* folder;
//folder = "C:\\Users\\SaMaN\\Desktop\\Ppln";
folder = "/tmp";
struct stat sb;
if (stat(folder, &sb) == 0 && S_ISDIR(sb.st_mode)) {
printf("YES\n");
} else {
printf("NO\n");
}
}
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()");
最善の方法は、おそらくopendir()
だけを使用して開くことです。
seファイルシステムリソースを試して、それが存在しないために発生したエラーを処理するだけでなく、チェックしてから後で試すことをお勧めします。後者のアプローチには明らかな競合状態があります。
man(2)stat に従って、st_modeフィールドでS_ISDIRマクロを使用できます。
bool isdir = S_ISDIR(st.st_mode);
補足として、他のOSでソフトウェアを実行できる場合は、BoostやQt4を使用してクロスプラットフォームサポートを簡単にすることをお勧めします。
access
をopendir
と組み合わせて使用して、ディレクトリが存在するかどうか、および名前は存在するがディレクトリではないかどうかを判断することもできます。例えば:
/* 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);
} else {
return -2; /* d exists, but not dir */
}
} else {
return -1; /* d does not exist */
}
return 1;
}