使用c ++在linux中检查文件存在和文件权限的最佳方法是什么

时间:2011-02-05 16:32:17

标签: c++ boost

我正在使用boost::filesystem::exists()检查文件是否存在。

有更好的方法吗?

另外,我如何找到文件权限?

4 个答案:

答案 0 :(得分:19)

检查文件是否存在的唯一正确方法是尝试打开它。检查文件是否可写的唯一正确方法是尝试打开它进行写入。其他任何事情都是竞争条件。 (其他API调用可以告诉你文件是否存在片刻,但即使它确实存在,也可能不存在15纳秒后,当你试图实际打开它时,所以它们在很大程度上无用)

但是,如果 你想知道文件是否存在而没有打开它,只需使用boost::filesystem::exists功能。但请注意其中存在的巨大缺陷。它不会告诉您文件是否存在,它会告诉您文件是否存在

所以要小心你如何使用它。不要假设只是因为函数返回true,当你实际尝试打开它时文件就会存在。

如果您需要知道“我能否打开此文件”,那么方式可以尝试打开它。

答案 1 :(得分:5)

我认为boost文件系统不会为您提供有关权限的任何信息。

我会选择低级方式(对于这种情况,这很简单):使用POSIX C API检查文件的存在和权限:使用`stat。


一个例子:

#include <sys/stat.h>
#include <iostream>

int main(int argc, char *argv[])
{
    struct stat sb;

    if( stat("file", &sb) == -1 ) {
        std::cout << "Couldn't stat(). Cannot access file, could assume it doesn't exist" << std::endl;
        return 1;
    }

    std::cout << "Permissions: " << std::oct << (unsigned long) sb.st_mode << std::endl;

    return 0;
}

运行它:

$ ./stat 
Couldn't stat(). Cannot access file, could assume it doesn't exist
$ touch file
$ ./stat
Permissions: 100644

答案 2 :(得分:4)

您是否只能尝试使用fopen()打开文件并检查返回值是否为null

答案 3 :(得分:4)

当然,使用boost是一种可移植的方式。

但是,如果你真的只对Linux感兴趣,你可以使用access (2),它会告诉你文件是否存在以及你是否可以按照你想要的方式访问它(并且,不会触发审计警报)。