关于C++:检查目录是否存在于UNIX中(系统调用)

Checking if a directory exists in Unix (system call)

我在网上找不到解决我问题的方法。

我想在Unix中调用一个函数,传递一个目录的路径,并知道它是否存在。如果目录不存在,opendir()返回一个错误,但我的目标不是实际打开、检查错误,如果没有错误则关闭它,而是检查文件是否是目录。

请问有什么方便的方法吗?


posix系统上有两个相关函数:stat()和lstat()。这些用于确定路径名是否引用您有权访问的实际对象,如果是,返回的数据将告诉您它是什么类型的对象。stat()lstat()的区别在于,如果您给出的名称是符号链接,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_IS*宏检查其他文件类型:

  • S_ISDIR目录
  • S_ISREG常规文件
  • S_ISCHR字符设备
  • S_ISBLK闭塞装置
  • S_ISFIFO先进先出
  • S_ISLNK符号链接
  • S_ISSOCK插座

(有些系统也提供一些其他文件类型;例如,在Solaris上可以使用S_ISDOOR。)


您可以使用stat系统调用,将目录名作为第一个参数传递给它。如果目录存在,返回0,否则返回-1,errno设置为ENOENT

编辑:

如果返回值为0,则需要进行额外的检查,以确保参数实际上是一个目录,而不是文件/symlink/char特殊文件/blk特殊文件/fifo文件。为此,您可以使用stat structurest_mode字段。


你可以用test -d


如果你说的是空壳,这里有一个很好的答案。总结一下答案:

1
2
3
if [ -d"$DIRECTORY" ]; then
    # Control will enter here if $DIRECTORY exists
fi

如果您是在C程序内部交谈,可以使用stat()

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库。