我想知道如何检查我是否对文件夹具有写入权限。
我正在编写一个C ++项目,我应该将一些数据打印到result.txt文件中,但我需要知道我是否拥有权限。
Linux和Windows之间的检查有何不同?因为我的项目应该在Linux上运行,目前我在Visual Studio中工作。
答案 0 :(得分:9)
检查权限的可移植方法是尝试打开文件并检查是否成功。如果没有,并且errno
(从标题<cerrno>
设置为值EACCES
[是,使用一个S],那么您没有足够的权限。这应该同时适用于FILE *fp = fopen("results.txt", "w");
if (fp == NULL) {
if (errno == EACCES)
cerr << "Permission denied" << endl;
else
cerr << "Something went wrong: " << strerror(errno) << endl;
}
{3}}和Unix/Linux。标准示例:
errno
Iostreams会有所不同。 AFAIK,他们不保证在两个平台上设置{{1}},或报告更多特定错误而不仅仅是“失败”。
正如Jerry Coffin所写,不依赖于单独的访问测试功能,因为您的程序将容易出现竞争条件和安全漏洞。
答案 1 :(得分:5)
关于唯一合理的事情是尝试创建文件,如果失败,告诉用户有问题。任何提前测试的尝试,只有在你能够创建并写入文件时才尝试创建文件,这会导致竞争条件出现问题(检查时有权限,但是当你尝试时它被删除了使用它,反之亦然)和极端情况(例如,您有权限在该目录中创建文件,但尝试在那里写入将超过您的磁盘配额)。要知道的唯一方法是尝试......
答案 2 :(得分:3)
实际测试文件写入权限的最正确方法是尝试写入文件。这是因为不同的平台以非常不同的方式公开写权限。更糟糕的是,仅仅因为操作系统告诉您可以(或不能)写入文件,它实际上可能在于,例如,在unix系统上,文件模式可能允许写入,但文件是只读的媒体,或者相反,该文件实际上可能是内核为进程自己使用而创建的字符设备,因此即使其文件模式设置为全零,内核也允许该进程(并且只有该进程)进行清理所有它喜欢。