【发布时间】:2011-04-17 11:26:18
【问题描述】:
我想知道如何检查我是否对文件夹有写权限。
我正在编写一个 C++ 项目,我应该将一些数据打印到一个 result.txt 文件中,但我需要知道我是否有权限。
Linux 和 Windows 之间的检查是否不同?因为我的项目应该在 Linux 上运行,而目前我在 Visual Studio 中工作。
【问题讨论】:
标签: c++ file permissions
我想知道如何检查我是否对文件夹有写权限。
我正在编写一个 C++ 项目,我应该将一些数据打印到一个 result.txt 文件中,但我需要知道我是否有权限。
Linux 和 Windows 之间的检查是否不同?因为我的项目应该在 Linux 上运行,而目前我在 Visual Studio 中工作。
【问题讨论】:
标签: c++ file permissions
唯一合理的做法是尝试创建文件,如果失败,告诉用户有问题。任何提前测试的尝试,并且只有在您能够创建和写入文件的情况下才尝试创建文件,否则会因竞争条件而出现问题(在您检查时已获得许可,但在您尝试时已将其删除使用它,反之亦然)和极端情况(例如,您有权限在该目录中创建文件,但尝试在那里写入将超出您的磁盘配额)。唯一知道的方法就是尝试...
【讨论】:
实际测试文件写入权限的最正确方法是尝试写入文件。这样做的原因是因为不同的平台以非常不同的方式公开写权限。更糟糕的是,仅仅因为操作系统告诉您可以(或不能)写入文件,它实际上可能是在撒谎,例如,在 unix 系统上,文件模式可能允许写入,但文件处于只读状态媒体,或者相反,该文件实际上可能是内核为进程自己使用而创建的字符设备,因此即使其文件模式设置为全零,内核也允许该进程(并且仅该进程)使用它它喜欢的一切。
【讨论】:
检查权限的可移植方法是尝试打开文件并检查是否成功。如果没有,并且errno(从标头<cerrno> 设置为值EACCES [是,有一个S],那么您没有足够的权限。这应该适用于Unix/Linux 和Windows . stdio 示例:
FILE *fp = fopen("results.txt", "w");
if (fp == NULL) {
if (errno == EACCES)
cerr << "Permission denied" << endl;
else
cerr << "Something went wrong: " << strerror(errno) << endl;
}
Iostreams 的工作方式会有所不同。 AFAIK,他们不保证在两个平台上都设置errno,或者报告比“失败”更具体的错误。
正如 Jerry Coffin 所写,不要依赖单独的访问测试函数,因为您的程序很容易出现竞争条件和安全漏洞。
【讨论】:
与接受的答案类似,但使用未弃用的 fopen_s 函数以及现代 C++ 和 append 打开模式以避免破坏文件内容:
bool is_file_writable(const std::filesystem::path &file_path)
{
FILE* file_handle;
errno_t file_open_error;
if ((file_open_error = fopen_s(&file_handle, file_path.string().c_str(), "a")) != 0)
{
return false;
}
fclose(file_handle);
return true;
}
【讨论】: