Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查文件的最佳方法是什么';使用c++;_C++_Boost - Fatal编程技术网

C++ 检查文件的最佳方法是什么';使用c++;

C++ 检查文件的最佳方法是什么';使用c++;,c++,boost,C++,Boost,我正在使用boost::filesystem::exists()检查文件是否存在 有更好的方法吗 还有,我如何找到文件权限?您是否可以尝试使用fopen()打开文件,并检查返回值是否为null?我认为boost文件系统不会给您任何有关权限的信息 我会选择低级的方法(对于本例来说,这非常简单):使用POSIX C API检查文件的存在和权限:使用`stat 例如: #include <sys/stat.h> #include <iostream> int main(in

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

有更好的方法吗


还有,我如何找到文件权限?

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

我认为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;
}

当然,使用boost是一种便携方式

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

检查文件是否存在的唯一正确方法是尝试打开它。检查文件是否可写的唯一正确方法是尝试打开文件进行写入。其他的都是比赛条件。(其他API调用可以告诉您该文件刚才是否存在,但即使存在,15纳秒后,当您尝试实际打开它时,它可能不存在,因此它们基本上是无用的)

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

所以使用时要小心。不要仅仅因为函数返回true,就认为当您实际尝试打开该文件时,该文件将存在


如果您需要知道“我是否可以打开此文件”,那么唯一的方法就是尝试打开它。

您在使用
boost
?(通过更改
模式
-参数检查是否可以读取或写入)时遇到任何问题。这很好,但它并不总是有效。这是一个巨大的比赛条件。如果
stat
说该文件存在,然后立即将其删除,该怎么办?如果在您检查时和稍后尝试打开文件时权限发生更改,该怎么办?@jalf:OP没有说明需要检查文件权限的内容。他甚至可能想为
ls
编写一个替换文件。文件权限检查主要是为了让用户了解其操作的原因failed@user592796:那么您应该使用失败的文件打开函数报告的错误。否则,jalf是正确的:有可能在您的
打开失败后,该文件立即被一个可以打开的文件替换,并且您不知道报告什么错误。是的,但这是一个非常重要和微妙的问题,所以我觉得至少应该在您的回答中提到它。你说得对,有些情况下这是不必要的。但是任何编写文件I/O代码的人都应该知道这一点。
$ ./stat 
Couldn't stat(). Cannot access file, could assume it doesn't exist
$ touch file
$ ./stat
Permissions: 100644