2012-01-23 22 views
4

我最近在应用程序中添加了使用GetTempPath。在代码审查它强调的是GetTempPath的描述所包含的信息:检查目录的正确方法可用于编写

应用程序应该先于任何使用文件I/O操作验证的路径和足够的访问权限存在的路径。

现在,所有的文件访问都被封装在try/catch块中,并且会有哪些系统无法访问它自己的临时目录?

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

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

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

回答

4

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

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

+0

+1我同意100% –

+0

特别是当AV产品介入时游戏发生变化。它们以安全名称阻止临时文件夹中的某些操作而闻名,例如,阻止可执行文件。 – Deanna

3

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

如果您试图以任何其他方式执行此操作,那么您将只是复制即将运行的系统代码。而且您很少有机会将它完美地复制到当前版本的Windows和未来版本中。

有没有必要创建一个文件,并写一个字节。假设您有对临时文件夹的写入权限,并尝试写入您需要的整个文件。如果你遇到失败,那么你最好也可以终止这个过程。如果您无法写入临时文件夹,那么在继续操作方面没有多少意义。

+0

那么我会复制代码,无论如何要通过编写文件并查看是否有访问被拒绝的消息。我想测试一下目录是否存在,是否可写,如果不存在,我可以回退到默认目录。 –

+1

不要打扰。 MSDN文档的这一部分仅仅意味着GetTempPath API不会为您创建目录。这并不意味着它不存在是正常的或合理的。假设临时文件夹在那里并写入它。如果失败,则向用户报告错误并放弃。考虑将工作临时文件夹作为软件的先决条件。或者像这样想,如果你的“默认目录”不可用?你会因此而倒退吗?你必须在某处画线。 –

+0

我有同样的问题。在某些时候,我需要知道我是否有权访问某个目录。现在我有一个可以工作的解决方案(在该目录中创建一个随机名称的文件,检查创建是否成功并删除文件)。唯一的问题是如果目录是只写的,那么之前创建的文件不能被删除。 –

相关问题