【问题标题】:Windows API to fetch file attributes if path contains Symbolic link?如果路径包含符号链接,Windows API 来获取文件属性?
【发布时间】:2014-10-14 06:03:26
【问题描述】:

我使用_stat64(const char *path, struct __stat64 *buffer); API 来获取文件/目录统计信息,但如果输入路径包含符号链接,此 API 将失败。

如果文件路径包含符号链接,GetFileAttributes()GetFileAttributesEx() API 也会失败。但是正如MSDN 中提到的,如果路径指向符号链接,这两个函数会返回符号链接的属性。如果路径指向符号链接,即使 _stat64() 也可以工作。

如果路径包含 [not points to] 符号链接,是否有任何方法可以获取文件/目录的状态/属性?

例如 - 如果输入路径为“D:\temp\symbolic_link\test”,如何获取“test”目录的属性

[编辑1] 由于 eryksun 的评论是有道理的。我再次尝试了 GetFileAttributesEx() 和 _stat64()。它有效,但这次我已授予目标目录和符号链接的完全权限。这似乎是权限问题。如果我通过 "D:\temp\symbolic_link" 那么我得到符号链接的属性/统计信息,如果我通过 "D:\temp\symbolic_link\test" 那么我获取预期的测试目录的属性/统计信息。

【问题讨论】:

  • 哪个 Windows 版本? GetFileAttributes 在 Windows 7 中为我遍历目录符号链接。
  • @eryksun 我也在 Windows 7 上。您是否将 D:\temp\symbolic_link\test 或 D:\temp\symbolic_link 传递给 GetFileAttributes() ?第一条路径失败,但第二条路径有效。
  • 我创建了一个目录符号mklink /d C:\Source\test\symbolic_link C:\Windows,然后调用GetFileAttributesW(L"C:/Source/test/symbolic_link/System32")
  • @eryksun 那行得通吗?至少在我的系统中没有。
  • 这是我在发表初步评论之前测试过的(32 位和 64 位)。它失败让您感到困惑,因为内核正在进行几乎相同的 I/O 和对象管理器调用,这些调用将解析路径并在其他上下文中打开目录。例如,我不希望您能够在目标目录中创建文件。

标签: c++ c windows winapi


【解决方案1】:

MSDN 页面中没有任何内容与您的问题相关,但您可能希望通过执行以下操作来获取文件的真实路径:

void realpath(const char *filename, wchar_t *pathbuf, int size)
{
    OFSTRUCT of;
    HANDLE file = (HANDLE)OpenFile(filename,&of,OF_READ);
    GetFinalPathNameByHandle(file,pathbuf,size,FILE_NAME_OPENED);
    CloseHandle(file);
}

这将用重新解析的文件路径名填充 pathbuf(直到大小的长度)。

我希望这会有所帮助。

【讨论】:

  • 谢谢格萨。一旦我发现这个分析器stackoverflow.com/questions/221417/…,即使我也这么想。我会等几天再标记它的答案,希望有人有更好的建议。
  • 我遇到的问题可能是由于权限问题,但我的问题将通过使用 GetFinalPathNameByHandle(file,pathbuf,size,FILE_NAME_OPENED); API。
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2011-09-16
相关资源
最近更新 更多