2013-10-30 70 views
1

我偶然发现GetFullPathName()(通过使用QFileInfo::canonicalFilePath())的行为,我不太明白:当我用当前驱动器号和冒号组成的字符串调用该函数时,它返回当前工作的路径目录,而我期望的驱动器号的路径。为什么GetFullPathName返回工作目录?

下面的代码举例说明什么我谈论:

#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”是当前盘符?

回答

5

msdn

如果文件名开头只有一个磁盘代号,但不是 反斜杠冒号后,它被解释为相对路径 当前目录的驱动器具有指定信。请注意, 当前目录可能是也可能不是根目录,具体取决于 它在该磁盘上最近的“更改目录” 操作期间的设置。此格式的

实例如下:

  1. “C:tmp.txt” 指的是在当前目录 名为 “tmp.txt” 驱动器C
  2. “C文件: TEMPDIR \ tmp.txt”指的是在一个子目录中的文件到 当前驱动器目录下
1

它一直这样,因为旧的DOS时代。如果您的当前目录位于驱动器D:上,则D:将始终为您的当前目录。在文档中谈到的情况是当您从当前目录所在的位置通过驱动器不同

相关问题