【问题标题】:How to check folder have write permission or not in c++如何在c ++中检查文件夹是否具有写权限
【发布时间】:2014-03-27 06:14:18
【问题描述】:

我想在“d:\test\”中写入一个文件,不幸的是我没有该文件夹的写入权限。 如何检查该文件夹是否具有写入权限。

注意:fopen 很有帮助,但那会创建一个新文件。我不想创建 exra 文件。

我也看到了 CreateFile(),不知道如何在这种情况下使用它。

【问题讨论】:

  • 几乎唯一正确的测试是尝试写入,并在失败时做出反应。将测试与尝试分开几乎不可避免地会导致竞争条件。
  • 不尝试写入文件,就没有别的办法了吗? @杰里棺材
  • @bala 恐怕不行。另一个例子是当你有写权限,但没有足够的空间,所以即使你检查权限,你以后也无法创建一致的文件。是的,检查可用磁盘空间也会导致竞争条件。
  • 是的,你的权利@mike.dld。谢谢。

标签: c++ c directory createfile


【解决方案1】:

只需打开(并写入)文件并分析系统返回的错误(如果有)。检查您是否在单独的操作中拥有权限会导致竞争条件,其中第一次调用告诉您可以创建文件,而第二次调用失败,因为访问权限已更改。

【讨论】:

  • 至少在windows上你可以拥有创建文件权限而没有删除文件权限。这最终会留下很多陈旧的测试文件。
  • 提前检查权限不足可能是明智之举,并且仍然可以正常处理操作系统的错误/异常。提前检查并不总是一个坏主意,这取决于您是否打算只提前检查。
【解决方案2】:

实际上,检查您是否有写入权限的一种方法是使用security access functions。在那里您可以查询所有不同的权限(删除、创建、写入、索引...)

我从未使用过它们,所以我无法为您提供示例。

请记住,在检查您的访问权限和创建文件或写入文件之间,访问权限可能会发生变化,但仍然可能会失败。其他人提到的比赛条件。

如果您最终还是要创建一个文件,那么只需使用其他人提到的CreateFile

【讨论】:

    【解决方案3】:

    备选方案 1:

    您可以使用_access_access_s 来检查文件是否有权限。

    更多信息here

    00 Existence only
    02 Write-only
    04 Read-only
    06 Read and write
    

    备选方案 2:

    正如您已经尝试过的CreateFile,使用GENERIC_WRITE 作为您的dwDesiredAccess

    然后查看错误(如果有)。

    更多详情here

    PS:如果您仍然只需要检查(而不是写入/创建文件),请删除临时文件(如果已创建)。

    【讨论】:

    • @bala 用 _access 更新了答案
    • 你试过了吗?它对我不起作用。我用于该文件夹没有写权限的文件夹。
    • @bala,您无法检查文件夹的权限......但只需将 tempfilename 附加到现有文件夹并使用 _access。 (无论如何文件都不会被创建..)然后你只需检查什么是返回码。你试过了吗?
    • 如果临时文件名可用则返回 0。如果没有则返回 -1。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2015-09-04
    • 2011-06-06
    • 2011-03-10
    • 1970-01-01
    • 2016-04-23
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多