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

问题描述:

我使用boost::filesystem::exists()来检查文件的存在。什么是最好的方式来检查文件的存在和使用c + +在linux中的文件权限

有没有更好的方法来做到这一点?

另外如何找到文件权限?

+1

使用`boost`时你有什么问题吗? – Naveen 2011-02-05 16:39:59

难道你只是试图用fopen()打开文件,并检查返回值是否为null

+0

(检查是否可以通过更改`mode`参数来进行读或写操作。) – anroesti 2011-02-05 16:50:03

我不认为增强文件系统会给你任何有关权限的信息。

我会去的低水平方式(这是无论如何很简单,对于这种情况下):使用POSIX C API来检查文件的存在和权限:使用`统计。


一个例子:

#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

这很好,除非它不总是有效。这是一个巨大的激烈竞争条件。如果`stat`说文件存在,那么,如果之后立即删除它?如果权限在您检查的时间和您尝试打开文件的时间之间发生变化,该怎么办? – jalf 2011-02-05 22:05:54

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

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

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

但是,如果想要知道文件是否存在而不打开它,只需使用boost::filesystem::exists函数。但请注意其中的缺陷。它不会告诉您文件是否存在,它会告诉您文件是否存在

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

如果您需要知道“我将能够打开此文件”,那么只有的方式才能找出是试图打开它。