4

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

在用于文件 I/O 操作之前,应用程序应验证路径的存在和对该路径的足够访问权限。

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

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

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

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

4

2 回答 2

4

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

Furthermore, just because you can write there now doesn't mean you can write there later. The user or other programs may delete things, change security settings, lock directories, etc. Trying to validate ahead of time that it's a place you can write is a waste of time. Just write when you need to, and be prepared for failure.

于 2012-01-23T17:26:23.930 回答
3

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

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

无需创建文件并向其写入单个字节。假设您对临时文件夹具有写入权限并尝试写入您需要的整个文件。如果您遇到失败,那么您也可以终止该过程。如果您无法写入临时文件夹,则继续进行没有多大意义。

于 2012-01-23T15:14:42.790 回答