【问题标题】:Correct way of checking a directory is available for writing检查目录的正确方法可用于写入
【发布时间】:2012-01-23 15:10:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 尤其是当 AV 产品涉及时,游戏会发生变化。他们以安全的名义阻止临时文件夹中的某些操作而闻名,例如阻止可执行文件。
    【解决方案2】:

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

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

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

    【讨论】:

    • 好吧,我将通过写入文件并查看是否收到拒绝访问消息来复制无论如何都会发生的代码。我想测试目录是否存在并且可写,如果不存在,我可以回退到默认目录。
    • 别打扰了。 MSDN 文档的那部分只是意味着 GetTempPath API 不会为您创建目录。这并不意味着它不存在是正常或合理的。假设临时文件夹在那里并写入它。如果失败,向用户报告错误并放弃。考虑将工作临时文件夹作为软件的先决条件。或者这样想,如果你的“默认目录”不可用怎么办?你会为此退缩吗?你必须在某处画线。
    • 我也有同样的问题。在某些时候,我需要知道我是否对某个目录具有写访问权。现在我有一个可行的解决方案(在该目录中创建一个具有随机名称的文件,检查创建是否成功并删除该文件)。唯一的问题是,如果目录是只写的,那么之前创建的文件就不能被删除。
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 2011-11-08
    • 2017-06-29
    • 1970-01-01
    • 2017-01-05
    • 2015-02-21
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多