C++ 为什么GetFullPathName返回工作目录?

C++ 为什么GetFullPathName返回工作目录?,c++,winapi,path,C++,Winapi,Path,我偶然发现了(通过使用)的一个行为,但我不太了解:当我使用由当前驱动器号和冒号组成的字符串调用此函数时,它返回当前工作目录的路径,而我希望返回驱动器号的路径 以下代码举例说明了我所说的内容: #include <windows.h> #include <iostream> #include <string> std::string canonicalFilePath(const char *path) { static const std::size

我偶然发现了(通过使用)的一个行为,但我不太了解:当我使用由当前驱动器号和冒号组成的字符串调用此函数时,它返回当前工作目录的路径,而我希望返回驱动器号的路径

以下代码举例说明了我所说的内容:

#include <windows.h>
#include <iostream>
#include <string>

std::string canonicalFilePath(const char *path)
{
    static const std::size_t BufferSize = 300;
    char canonicalPath[BufferSize];

    GetFullPathName(path, BufferSize, canonicalPath, 0);

    return std::string(canonicalPath);
}

int main(int, char **)
{
    SetCurrentDirectory("C:/some/path");
    std::cout << "In C:" << '\n';
    std::cout << "  C   -> " << canonicalFilePath("C")   << '\n'
              << "  C:  -> " << canonicalFilePath("C:")  << '\n'
              << "  C:/ -> " << canonicalFilePath("C:/") << '\n'
              << "  D   -> " << canonicalFilePath("D")   << '\n'
              << "  D:  -> " << canonicalFilePath("D:")  << '\n'
              << "  D:/ -> " << canonicalFilePath("D:/") << '\n';

    SetCurrentDirectory("D:/other/path");
    std::cout << "In D:" << '\n';
    std::cout << "  C   -> " << canonicalFilePath("C")   << '\n'
              << "  C:  -> " << canonicalFilePath("C:")  << '\n'
              << "  C:/ -> " << canonicalFilePath("C:/") << '\n'
              << "  D   -> " << canonicalFilePath("D")   << '\n'
              << "  D:  -> " << canonicalFilePath("D:")  << '\n'
              << "  D:/ -> " << canonicalFilePath("D:/") << '\n';
}
这种行为正常吗?在这方面,有人指出

如果指定“U:”则返回的路径为“U:\”

如果“U”是当前驱动器号,为什么不是这样呢?

来源:

如果文件名仅以磁盘指示符开头,而不是以 冒号后的反斜杠将被解释为到 驱动器上具有指定字母的当前目录。注意 当前目录可能是根目录,也可能不是根目录,具体取决于 在最近的“更改目录”期间设置的内容 磁盘上的操作

该格式的示例如下:

  • “C:tmp.txt”是指当前目录中名为“tmp.txt”的文件 在驱动器C上
  • “C:tempdir\tmp.txt”是指子目录中的文件,用于 驱动器C上的当前目录

  • 从旧时起就是这样。如果当前目录位于驱动器
    D:
    ,则
    D:
    将始终是当前目录。文档中讨论的情况是,当您传递与当前目录不同的驱动器时

    In C:
      C   -> C:\some\path\C      // ok
      C:  -> C:\some\path        // ? why not C:\ ?
      C:/ -> C:\                 // ok
      D   -> C:\some\path\D      // ok
      D:  -> D:\                 // ok
      D:/ -> D:\                 // ok
    In D:
      C   -> D:\other\path\C     // ok
      C:  -> C:\                 // ok
      C:/ -> C:\                 // ok
      D   -> D:\other\path\D     // ok
      D:  -> D:\other\path       // ? why not D:\ ?
      D:/ -> D:\                 // ok