检查Windows / Linux中文件的写入权限

时间:2010-09-26 17:49:26

标签: c++ file permissions

我想知道如何检查我是否对文件夹具有写入权限。

我正在编写一个C ++项目,我应该将一些数据打印到result.txt文件中,但我需要知道我是否拥有权限。

Linux和Windows之间的检查有何不同?因为我的项目应该在Linux上运行,目前我在Visual Studio中工作。

3 个答案:

答案 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系统上,文件模式可能允许写入,但文件是只读的媒体,或者相反,该文件实际上可能是内核为进程自己使用而创建的字符设备,因此即使其文件模式设置为全零,内核也允许该进程(并且只有该进程)进行清理所有它喜欢。