Checking if a directory exists in Unix (system call)
我在网上找不到解决我问题的方法。
我想在Unix中调用一个函数,传递一个目录的路径,并知道它是否存在。如果目录不存在,
请问有什么方便的方法吗?
posix系统上有两个相关函数:stat()和lstat()。这些用于确定路径名是否引用您有权访问的实际对象,如果是,返回的数据将告诉您它是什么类型的对象。
1 2 3 4 5 6 7 8 | #include <sys/stat.h> struct stat sb; if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode)) { ...it is a directory... } |
如果函数表明它是成功的,那么可以使用
还可以使用其他
S_ISDIR 目录S_ISREG 常规文件S_ISCHR 字符设备S_ISBLK 闭塞装置S_ISFIFO 先进先出S_ISLNK 符号链接S_ISSOCK 插座
(有些系统也提供一些其他文件类型;例如,在Solaris上可以使用
您可以使用
编辑:
如果返回值为
你可以用
如果你说的是空壳,这里有一个很好的答案。总结一下答案:
1 2 3 | if [ -d"$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists fi |
如果您是在C程序内部交谈,可以使用
1 2 3 4 5 6 | { struct stat st; if(stat("/tmp",&st) == 0) printf(" /tmp is present "); } |
另一个简单的方法是:
1 2 3 4 5 6 7 | int check(unsigned const char type) { if(type == DT_REG) return 1; if(type == DT_DIR) return 0; return -1; } |
然后可以将structdirent*对象的d_类型传递给check函数。
如果check返回1,则该路径指向常规文件。
如果check返回0,则该路径指向一个目录。
否则,它既不是文件也不是目录(它可以是块设备/符号链接等)。
测试和工作良好:
1 2 3 4 5 6 7 8 9 10 | int file_exist (char *filename) { char s[200]; sprintf(s,"test -e %s", filename); if (system(s) == 0){ return 1; }else{ return 0; } } |
如果您真的不关心这个文件系统对象的类型,那么access(name,f_ok)会检查这个名称的东西是否存在。如果需要确保这是目录,请使用stat()并使用s_isdir()宏检查type。
我认为函数stat可以做你想做的(我没有测试它的目录)。在C++中,还可以使用Boosi::FielSoeStudio库。