2

我偶然发现了一个我不太理解的行为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”是当前驱动器号,为什么不是这种情况?

4

2 回答 2

5

来自msdn

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

这种格式的例子如下:

  1. “C:tmp.txt”指的是驱动器 C 上当前目录中名为“tmp.txt”的文件。
  2. “C:tempdir\tmp.txt”指的是驱动器 C 上当前目录的子目录中的文件。
于 2013-10-30T08:41:53.230 回答
1

从旧的 DOS 时代开始就是这样。如果您的当前目录在 drive 上D:,那么D:将始终是您的当前目录。文档中讨论的情况是当您传递与当前目录不同的驱动器时。

于 2013-10-30T08:42:05.710 回答