检查Unix中是否存在目录(系统调用)

时间:2010-09-30 06:08:46

标签: c++ c unix directory exists

我无法在线找到解决问题的方法。

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

有没有方便的方法呢?

8 个答案:

答案 0 :(得分:104)

POSIX系统上有两个相关功能:stat() and lstat()。这些用于查明路径名是否指向您有权访问的实际对象,如果是,则返回的数据会告诉您它是什么类型的对象。 stat()lstat()之间的区别在于,如果您提供的名称是符号链接,则stat()将跟随符号链接(或链接在一起的链接)并报告对象链接链的末尾,而lstat()报告符号链接本身。

#include <sys/stat.h>

struct stat sb;

if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode))
{
    ...it is a directory...
}

如果函数指示它成功,则使用<sys/stat.h>中的S_ISDIR()宏来确定该文件是否实际上是一个目录。

您还可以使用其他S_IS*宏检查其他文件类型:

  • S_ISDIR - 目录
  • S_ISREG - 常规文件
  • S_ISCHR - 角色设备
  • S_ISBLK - 阻止设备
  • S_ISFIFO - FIFO
  • S_ISLNK - 符号链接
  • S_ISSOCK - socket

(某些系统也提供了一些其他文件类型;例如,Solaris上提供了S_ISDOOR。)

答案 1 :(得分:5)

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

编辑:

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

答案 2 :(得分:3)

您可以使用test -d

答案 3 :(得分:2)

如果你是在谈论一个shell,那就有一个很好的答案here.总结一下这个答案:

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

如果你在C程序内部进行交谈,可以使用stat()

{
    struct stat st;
    if(stat("/tmp",&st) == 0)
        printf(" /tmp is present\n");
}

答案 4 :(得分:1)

如果您并不真正关心此文件系统对象的类型,则访问(名称,F_OK)会检查具有此名称的内容是否存在。 如果您需要确定这是目录,请使用stat()并使用S_ISDIR()宏检查类型。

答案 5 :(得分:1)

经过测试和正常工作:

int file_exist (char *filename)
{
    char s[200];
    sprintf(s, "test -e %s", filename);
    if (system(s) == 0){
        return 1;
    }else{
        return 0;
    }
}

答案 6 :(得分:1)

另一种简单的方法是:

int check(unsigned const char type) {
    if(type == DT_REG)
        return 1;
    if(type == DT_DIR)
        return 0;
    return -1;
}

然后可以将 struct dirent * 对象的d_type传递给 check 函数。

如果check返回1,则该路径指向常规文件。

如果check返回0,则该路径指向目录。

否则,它既不是文件也不是目录(可以是块设备/符号链接等)。

答案 7 :(得分:0)

我认为函数stat可以做你想要的(我没有测试它的目录)。在C ++中,您还可以使用boost :: filesystem库。