可以通过正确的方式检查目录

时间:2012-01-23 15:10:50

标签: windows winapi visual-c++ directory file-access

我最近在应用程序中添加了GetTempPath的使用。在代码审查期间,突出显示GetTempPath的描述包含以下信息:

  

在用于文件I / O操作之前,应用程序应验证路径是否存在以及对路径的适当访问权限。

现在所有文件访问都包含在try / catch块中,哪些系统没有访问它自己的临时目录?

我最初的想法是尝试创建目录(如果它们不存在(通过GetFileAttributes和CreateDirectory))然后创建一个文件,写一个字节然后删除该文件。虽然这样做有点无知 - 当然有更好的方法来检查你是否有对文件夹的写入权限?

我开始查找并找到了文件属性常量,通用访问权限,标准访问权限,文件访问权限常量和GetSecurityInfo函数。所有这些似乎创建了一个比创建文件更长的解决方案,看看它是否适用于方法。

那么使用WinAPI函数检查您是否具有对文件夹的写入权限的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

MSDN说明具有误导性。您可能想要检查返回的路径是否存在(如果不存在,则创建它),但是知道您是否可以写入的唯一方法是在那里写。

此外,仅仅因为你现在可以写在那里并不意味着你以后可以在那里写。用户或其他程序可能会删除内容,更改安全设置,锁定目录等。尝试提前验证它是您可以编写的地方是浪费时间。只需在需要时写下,并为失败做好准备。

答案 1 :(得分:3)

最好的方法是尝试将文件写入目录。如果由于缺乏权限而导致写入失败,那么错误代码将告诉您。寻找ERROR_ACCESS_DENIED

如果您尝试以任何其他方式执行此操作,那么您将只复制即将运行的系统代码。对于当前版本的Windows和未来版本,您几乎没有机会完美地复制它。

无需创建文件并向其写入单个字节。假设您具有对临时文件夹的写入权限,并尝试编写您需要的整个文件。如果您遇到故障,那么您也可以终止该过程。如果您不能写入临时文件夹,则没有太多意义。