2010-09-26 106 views
7

我想知道如何检查我是否有权限写入文件夹。检查在Windows/Linux中写入文件权限

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

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

回答

8

检查权限的可移植方式是尝试打开文件并检查是否成功。如果没有,errno(从头部<cerrno>被设置为值EACCES [是,一个S],那么你就没有足够的权限,这应该在两个Unix/LinuxWindows工作示例标准输入输出:

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会略微有点不同。据我所知,他们不保证设置在两个平台上errno,或不仅仅是“失败”的报告更具体的错误。

正如杰里棺材写道:不依靠单独的访问测试功能,因为你的程序容易出现比赛条件和安全漏洞。

+0

谢谢,但我仍然没有站在如何我可以知道我是否有权写入文件到磁盘。 – Aviadjo 2010-09-26 18:30:39

+0

如果我尝试并没有权限,我认为该程序将崩溃,我想通过检查之前阻止它。有没有检查磁盘写入权限的命令(写入新文件)? – Aviadjo 2010-09-26 18:32:18

+2

为什么你的程序崩溃? :S – 2010-09-26 18:57:12

5

关于唯一合理的做法是尝试创建该文件,如果失败,则告诉用户存在问题。任何提前测试的尝试,只尝试创建文件,如果您能够创建并写入文件,则可能会遇到来自竞争条件的问题(在您检查时有权限,但在您尝试时删除了它使用它,反之亦然)和角落案例(例如,您有权限在该目录中创建文件,但试图在那里写入将超出您的磁盘配额)。要知道的唯一方法是尝试...

3

实际测试文件写入权限的最正确方法是尝试写入文件。原因是因为不同的平台以不同的方式显示写入权限。更糟糕的是,仅仅因为操作系统告诉你可以(或不能)写入文件,它可能实际上在撒谎,例如,在unix系统上,文件模式可能允许写入,但文件处于只读状态媒体,或者相反,该文件实际上可能是内核为进程自己使用而创建的字符设备,因此即使其文件模式设置为全零,内核也允许该进程(并且只有该进程)使用它所有它喜欢的。