【问题标题】:How to open the file system of a volume in CreateFile?如何在 CreateFile 中打开一个卷的文件系统?
【发布时间】:2013-01-08 03:04:49
【问题描述】:

CreateFile 上的 MSDN 页面说:字符串"\\.\C:\" 可用于打开 C: 卷的文件系统。但是,以下代码总是返回错误:ERROR_PATH_NOT_FOUND。

HANDLE h = CreateFile(L"\\\\.\\C:\\", FILE_READ_ATTRIBUTES, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0, OPEN_EXISTING, 0, 0);

我应该如何正确传递参数?

【问题讨论】:

  • 你想对生成的句柄做什么?
  • 我只是想知道为什么它没有按预期工作。我最初的意图是列出根目录下的文件。
  • 在我的情况下,我得到 INVALID_HANDLE_VALUE

标签: windows winapi filesystems runtime-error createfile


【解决方案1】:

如果您想要一个卷句柄(用于 I/O 控制代码),您需要删除尾部斜杠。

为了获得根目录的句柄,您需要保留尾部斜杠并在dwFlagsAndAttributes 参数中传递FILE_FLAG_BACKUP_SEMANTICS 标志。这记录在“目录”标题下的 MSDN 页面上。例如,如果您打算致电GetFileInformationByHandleGetFileInformationByHandleEx,这就是您想要执行的操作。

但是,通常情况下,您不会打开根目录的句柄来列出文件。相反,您将使用FindFirstFile/FindNextFile 或相关函数之一。

【讨论】:

  • 为什么会这样? C: 未在设备命名空间中定义。当然你必须使用L"\\??\\C:"
  • @Lewis,我从未找到任何文档清楚地解释了设备命名空间的工作方式,但请参阅超级用户上的 this answer。 C: 是GLOBAL?? 中的别名,可以使用 WinObj 确认。
  • 这很有趣,也许它同时搜索全局和设备命名空间。我将不得不查看我认为的对象管理器函数的源代码
【解决方案2】:

尝试删除尾部斜杠:

L"\\\\.\\C:"

【讨论】:

  • 我认为你误解了我的意思。我知道如果删除尾随反斜杠就可以了。但是,尽管文档明确声明尾部反斜杠是有效参数,但 CreateFile 始终返回错误。这就是我问题的重点。
猜你喜欢
  • 2014-11-22
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多