C++ GetFileAttributes不一致--为什么?

C++ GetFileAttributes不一致--为什么?,c++,winapi,ntfs,C++,Winapi,Ntfs,为什么会出现以下情况: GetFileAttributes(L"D:"); 返回0x00002010,但在完全相同的机器上返回以下内容: GetFileAttributes(L"\\\\?\\D:"); 返回无效的\u文件\u属性和错误代码错误\u无效的\u参数?您在问题和注释中给出的三个示例都涉及不同的内容 \\?\D:指不存在文件属性的卷 \\?\D:\是具有属性的驱动器的根目录 D:更难定义。我相信系统使用GetFullPathName或等效工具来扩展此路径。因此,如果进程当前目录位

为什么会出现以下情况:

GetFileAttributes(L"D:");
返回
0x00002010
,但在完全相同的机器上返回以下内容:

GetFileAttributes(L"\\\\?\\D:");

返回
无效的\u文件\u属性
和错误代码
错误\u无效的\u参数

您在问题和注释中给出的三个示例都涉及不同的内容

  • \\?\D:
    指不存在文件属性的卷
  • \\?\D:\
    是具有属性的驱动器的根目录
  • D:
    更难定义。我相信系统使用
    GetFullPathName
    或等效工具来扩展此路径。因此,如果进程当前目录位于
    D
    ,则使用该目录。或者,如果为此驱动器定义了特殊目录,则使用该目录。否则
    D:\
    ,将使用根目录

您想在此处使用
D:\
\\?\D:\

你在问题和评论中给出的三个例子都涉及不同的事情

  • \\?\D:
    指不存在文件属性的卷
  • \\?\D:\
    是具有属性的驱动器的根目录
  • D:
    更难定义。我相信系统使用
    GetFullPathName
    或等效工具来扩展此路径。因此,如果进程当前目录位于
    D
    ,则使用该目录。或者,如果为此驱动器定义了特殊目录,则使用该目录。否则
    D:\
    ,将使用根目录

您想在此处使用
D:\
\\?\D:\

似乎与“\\?\D:\”一起工作@chris:是的,我也注意到了。Win32将D:解释为驱动器D上的当前目录,它不一定与根目录相同。内核将\\?\D:解释为D卷设备;据我所知,设备没有文件属性,所以ERROR\u INVALID\u参数是一个合理的结果。@HarryJohnston它比这个稍微复杂一点。驱动器没有当前目录。每个进程有一个。我知道cmd.exe使用私有环境变量来伪造每个驱动器一个,但我们这里说的是Win32。但是,如果
D:
是进程当前目录所在的驱动器,则
D:
引用该当前目录。否则它指的是根。这有点奇怪!如果将来的读者想知道每个驱动器当前目录是否被cmd.exe伪造,您可以在这里找到更多信息:似乎与“\\?\D:\”一起工作。@chris:是的,我也注意到了。Win32将D:解释为驱动器D上的当前目录,它不一定与根目录相同。内核将\\?\D:解释为D卷设备;据我所知,设备没有文件属性,所以ERROR\u INVALID\u参数是一个合理的结果。@HarryJohnston它比这个稍微复杂一点。驱动器没有当前目录。每个进程有一个。我知道cmd.exe使用私有环境变量来伪造每个驱动器一个,但我们这里说的是Win32。但是,如果
D:
是进程当前目录所在的驱动器,则
D:
引用该当前目录。否则它指的是根。这有点奇怪!对于任何想知道每个驱动器当前目录是否由cmd.exe伪造的未来读者,您可以在此处找到更多信息:-1“否则,D:指驱动器上的根目录”是不正确的。是一个简单的示例,在messagebox中显示进程的每个驱动器当前目录。如果没有多个驱动器,则可以使用
subst
命令创建逻辑驱动器。这是这个答案不正确的简单证明。@Cheersandhth.-Alf你的例子证明不了什么。它只是从承载它的cmd.exe进程中获取私有环境变量。如果你从浏览器开始,双击exe,行为就不同了。我在主函数的开头添加了以下内容:
SetCurrentDirectory(L“E:\\temp”);SetCurrentDirectory(L“C:\\desktop”)然后运行。
E
的输出是
E:`。是cmd.exe而不是Win32完成了这一切。@DavidHeffernan:“反驳废话所需的能量比产生废话所需的能量大一个数量级。”(我承认让你承认错误对我来说是不可能的。我不够好:这需要一个心理学家,而不是一个工程师。我已经给了你一个完整的计划让你去尝试。我想我已经做得够多了。@Cheersandhth.-Alf我必须评论你在这些评论中对我说话的方式。你是轻蔑和优越的。你很清楚地表明了这一点你觉得我是不可轻视的,完全低于你。我不明白你为什么会那样做。即使你感觉到了,你也应该隐藏它。-1“否则,D:指驱动器上的根目录”不正确。是一个简单的示例,在消息框中显示进程的每个驱动器当前目录。如果您没有多个驱动器,则可以使用
subst
命令创建逻辑驱动器。这是一个简单的证据,证明这个答案不正确。@cheers-sandhth.-Alf您的示例没有证明任何问题。它只是选择了私有驱动器托管它的cmd.exe进程中的环境变量。如果您从浏览器(例如,通过双击exe)启动它,行为会有所不同。我在主函数的开头添加了以下内容:
SetCurrentDirectory(L“E:\\temp”);SetCurrentDirectory(L“C:\\desktop”)然后运行。
E
的输出是
E:`。是
cmd.exe`完成了所有这些,而不是Win32。@DavidHeffernan:“反驳废话所需的能量比产生废话所需的能量大一个数量级。”:(我承认让你承认错误对我来说是不可能的。我还不够好:这需要一个心理学家,而不是一个工程师。我已经给了你一个完整的程序来尝试。我