我正在使用boost::filesystem::exists()
检查文件是否存在。
有更好的方法吗?
另外,我如何找到文件权限?
答案 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),它会告诉你文件是否存在以及你是否可以按照你想要的方式访问它(并且,不会触发审计警报)。