2013-10-30 69 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:將始終爲您的當前目錄。在文檔中談到的情況是當您從當前目錄所在的位置通過驅動器不同

相關問題