如何检查目录是不是存在?
Posted
技术标签:
【中文标题】如何检查目录是不是存在?【英文标题】:How can I check if a directory exists?如何检查目录是否存在? 【发布时间】:2012-09-12 17:11:05 【问题描述】:如何在 C 语言中检查 Linux 上是否存在目录?
【问题讨论】:
C faster way to check if a directory exists的可能重复 这能回答你的问题吗? Checking if a directory exists in Unix (system call) 【参考方案1】:您可以使用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. */
【讨论】:
如果该文件夹不存在,如何确认不存在后立即创建? 如果您使用的是 Visual Studio,dirent.h
不可用,请参阅this SO post 了解替代方案【参考方案2】:
使用以下代码检查文件夹是否存在。它适用于 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");
【讨论】:
您确定包含的标头是否足够,至少对于 Linux 而言? S_ISDIR 仅适用于 POSIX,不适用于 Windows,请参阅 this SO post【参考方案3】:您可以使用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()");
【讨论】:
我想知道S_IFDIR
与 S_ISDIR
的区别,并在 stat
手册页上找到了这个:"POSIX.1-1990 没有描述 S_IFMT、S_IFSOCK、S_IFLNK、S_IFREG , S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX 常量,而是要求使用宏 S_ISDIR() 等。S_IF* 常量出现在 POSIX.1-2001 及更高版本中。”
(s.st_mode & S_IFDIR) : "" ? "not "
你好像把?
和:
搞混了【参考方案4】:
最好的方法可能是尝试打开它,例如只使用@987654321@
。
请注意,最好尝试使用文件系统资源,并处理由于它不存在而发生的任何错误,而不是先检查然后再尝试。后一种方法存在明显的竞争条件。
【讨论】:
【参考方案5】:根据man(2)stat,您可以在 st_mode 字段上使用 S_ISDIR 宏:
bool isdir = S_ISDIR(st.st_mode);
旁注,如果您的软件可以在其他操作系统上运行,我建议使用 Boost 和/或 Qt4 来简化跨平台支持。
【讨论】:
【参考方案6】:您还可以将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;
【讨论】:
不错,但我会将int xis_dir (char *d)
更改为 int xis_dir (const char *d)
,因为 d 没有被修改。以上是关于如何检查目录是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章