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

tag5nh1u  于 2023-03-22  发布在  Unix
关注(0)|答案(5)|浏览(200)

我无法在网上找到解决问题的方法。
我想在Unix中调用一个函数,传入一个目录的路径,并知道它是否存在。如果目录不存在,opendir()返回一个错误,但我的目标不是实际打开,检查错误,如果没有错误则关闭它,而是只是检查文件是否是目录。
请问有什么方便的方法吗?

ajsxfq5m

ajsxfq5m1#

在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-插座

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

k3fezbri

k3fezbri2#

您可以通过将目录名称作为第一个参数传递给stat系统调用来使用它。如果目录存在,则返回0,否则返回-1,并且errno将被设置为ENOENT
编辑:
如果返回值为0,则需要额外检查以确保参数实际上是一个目录,而不是文件/symlink/char special file/blk special file/FIFO文件。您可以使用stat structurest_mode字段。

rseugnpd

rseugnpd3#

如果你不关心这个文件系统对象的类型,access(name,F_OK)会检查这个文件系统对象是否存在。如果你需要确定这个文件系统对象是目录,使用stat()并使用S_ISDIR()宏检查类型。

tmb3ates

tmb3ates4#

另一个简单的方法是:

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,则该路径指向目录。
否则,它既不是文件也不是目录(它可以是块设备/符号链接等)。

bakd9h0s

bakd9h0s5#

C++17语言
使用std::filesystem::is_directory

#include <filesystem>

void myFunc(const std::filesystem::path& directoryPath_c)
{
    if (std::filesystem::is_directory(directoryPath_c)) {
    //if (std::filesystem::exists(directoryPath_c)) { // An alternative*
        // do something.
    }
}

noexept版本中:

#include <filesystem>

void myFunc(const std::filesystem::path& directoryPath_c)
{
    std::error_code ec{};
    if (std::filesystem::is_directory(directoryPath_c, ec)) {
    //if (std::filesystem::exists(directoryPath_c, ec)) { // An alternative*
        // do something.
    }
}
  • 另一种方法的缺点是,如果directoryPath_c作为常规文件存在,std::filesystem::exists(directoryPath_c)将返回true,尽管该文件夹不存在。

相关问题