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

use*_*796 6 c++ boost

boost::filesystem::exists()用来检查文件的存在.

有没有更好的方法呢?

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

jal*_*alf 19

检查文件是否存在的唯一正确方法是尝试打开它.检查文件是否可写的唯一正确方法是尝试打开它进行写入.其他任何事情都是竞争条件.(其他API调用可以告诉你,如果该文件存在刚才,但即使没有,也可能不存在,以后这15纳秒,当您尝试实际打开它,所以他们基本上没用)

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

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

如果您需要知道"我能否打开此文件",那么找出答案的唯一方法就是尝试打开它.


peo*_*oro 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;
}
Run Code Online (Sandbox Code Playgroud)

运行它:

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

  • 这很好,除了它并不总是有效.这是一个巨大的明显竞争条件.如果`stat`表示该文件存在,然后,之后立即删除该怎么办?如果在您检查的时间和尝试打开文件的较晚时间之间更改权限,该怎么办? (2认同)

anr*_*sti 4

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