为什么GetFullPathName返回的是工作目录?

4
我发现了一个关于 GetFullPathName() 的行为(通过使用 QFileInfo::canonicalFilePath()),我不太理解:当我使用由当前驱动器号和冒号组成的字符串调用此函数时,它返回当前工作目录的路径,而我期望得到驱动器号的路径。
以下代码是我所说的示例:
#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';
}

输出:

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

这种行为正常吗?在GetFullPathName文档中,它指出:

如果你指定了"U:",返回的路径是"U:\"。

如果"U"是当前的驱动器字母,为什么不是这种情况呢?

2个回答

5

来自 msdn:

如果文件名仅以磁盘标识符开头但不是冒号后的反斜杠,则将其解释为相对于指定字母驱动器上的当前目录的相对路径。请注意,当前目录可能是根目录,也可能不是根目录,具体取决于最近一次在该磁盘上执行的“更改目录”操作时它被设置为什么。

以下是此格式的示例:

  1. “C:tmp.txt”指的是驱动器C上当前目录中命名为“tmp.txt”的文件。
  2. “C:tempdir\tmp.txt”指的是驱动器C上当前目录的子目录中的文件。

1
自从早期的DOS时代以来,情况就是这样。如果您当前的目录在D驱动器上,则D驱动器将始终是您的当前目录。文档中讨论的情况是当您传递一个与当前目录不同的驱动器时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接