【问题标题】:Unreadable file attributes on windowsWindows上不可读的文件属性
【发布时间】:2017-12-29 11:54:48
【问题描述】:

考虑下面的sn-p代码

    #include <iostream>
    #include <windows.h>
    int main()
    {
        WIN32_FILE_ATTRIBUTE_DATA  wfad;

        GetFileAttributesEx(("C:\\TEMP\\noreadfile"), GetFileExInfoStandard, &wfad); //"noreadfile" is unreadable file
        std::cout << wfad.dwFileAttributes;  // 128                                                 
        return 0;
    }

对于 Windows 上不可读的文件(没有读取权限的文件或在其属性 -> 安全选项卡中将读取权限设置为“拒绝”的文件),GetFileAttributesEx 返回FILE_ATTRIBUTE_NORMAL,这意味着@该文件的 987654321@。

对于可写和非只读文件也返回此属性。

我们使用这些信息来设置产品代码中文件的权限。

我们得出结论,GetFileAttributesEx 可能会在文件不可读的情况下返回不正确的属性。我们想知道我们的结论是否正确。

如果是,那么这是 GetFileAttributesEx 的已知问题吗?

如果不是那么

使用 Windows API 或如果可能的话,使用 Boost 或标准 C++ 文件系统库获取 不可读文件 的文件属性(可能是文件权限?)的正确方法是什么?

【问题讨论】:

  • 文件属性(例如只读、系统、隐藏等)与文件安全​​无关。要获取文件的自主访问控制列表 (DACL),请致电 GetNamedSecurityInfo

标签: c++ winapi filesystems


【解决方案1】:

它可能根本没有成功。如果您查看documentation for GetFileAttributesEx,它实际上返回一个BOOL。

返回值 如果函数成功,返回值是一个非零 价值。

如果函数失败,则返回值为零 (0)。得到扩展 错误信息,请致电GetLastError

我的猜测是,如果调用失败,“fwad”是未定义的。尝试检查失败指示的返回值。我的猜测是 GetLastError 会返回类似 ERROR_ACCESS_DENIED 的内容。

Windows API 不会引发异常,因此很遗憾,您必须检查几乎每个返回值。

【讨论】:

  • OP 应该检查是否成功是正确的,但在这种情况下读取文件属性不太可能会失败,即使文件安全性拒绝读取它们的权利。 OP 很可能有权列出父目录“C:\Temp”。这隐含地允许读取目录中任何文件的属性。
  • 类似地,对目录的 delete-child 访问允许删除任何没有设置只读属性的文件,即使文件的安全性不允许这样做。这是父目录安全胜过包含文件的两种情况。
  • Odd... 通用的“读取”访问权限是 supposed to 包括“读取属性”,但据我所知,只要我可以看到所有文件的所有属性可以列出他们所在的目录。
  • 这是设计使然。列出目录时文件属性必须可用,因此列出父目录的权限始终授予读取文件属性的权限。
  • 这假定调用程序以有权访问相关目录的用户身份运行。如果是其他用户拥有的目录,很可能会被拒绝访问
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多