为什么GetFullPathName返回工作目录?

时间:2013-10-30 08:36:51

标签: c++ winapi path

我偶然发现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 documentation中,声明

  

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

如果“U”是当前的驱动器号,为什么不是这种情况?

2 个答案:

答案 0 :(得分:5)

来自msdn

  

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

     

此格式的示例如下:

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

答案 1 :(得分:1)

自从旧的DOS日以来就是这样。如果当前目录位于驱动器D:上,则D:将始终是您当前的目录。文档中讨论的案例是当您从当前目录所在的位置传递不同的驱动器时。