2014-09-29 27 views
1

根據MSDNC:tmp.txt的路徑應視爲相對路徑,但PathIsRelative()返回FALSE而不是TRUEPathIsRelative函數是WinAPI錯誤嗎?

這是一個錯誤?或者我誤解了某處?

+1

爲什麼它會讓你困惑,即PathIsRelative'爲相對路徑返回true?你甚至可以在你的問題中說明。 – 2014-09-29 12:00:08

+3

這顯然是你在原文中寫了「TRUE」的錯字。我編輯了這個問題來糾正錯誤。爲了清楚起見,我確認'PathIsRelative(「C:tmp.txt」)確實返回'FALSE'。 – 2014-09-29 12:17:49

+1

@David Heffernan感謝您的更正。 – 2014-09-29 12:59:13

回答

5

這取決於親屬的意思。像C:tmp.txt這樣的路徑非常特殊。它與驅動器C上的當前目錄相關。另一方面,tmp.txt相對於進程當前目錄。這可能不在驅動器C上。實際上,每個驅動器的當前目錄也是相當特殊的,通過一些好奇的環境變量來實現,純粹是爲了保持與DOS的兼容性。更多關於這個相當神祕的話題可以在Raymond Chen的文章中找到:Why does each drive have its own current directory?

看起來PathIsRelative從你的角度來看,相對路徑是什麼。 PathIsRelative函數不會將與指定驅動器上的工作目錄相關的路徑視爲相對路徑。因此PathIsRelative("C:tmp.txt")返回FALSE。如果你想要一個把這樣一條路徑看作是相對的函數,你可能必須自己編寫它。手工分析路徑以檢測這種情況非常簡單。

+1

例如,['ntdll!RtlDetermineDosPathNameType_U'](http://svn.reactos.org/svn/reactos/tags/ReactOS-0.3.16/reactos/lib/rtl/path.c?view=markup#l1296)返回['RTL_PATH_TYPE'](http://svn.reactos.org/svn/reactos/tags/ReactOS-0.3.16/reactos/include/ndk/rtltypes.h?view=markup#l428),即UNC( (Windows),相對驅動器('Windows'),驅動器相對('C:\ Windows'),驅動器相對('C:\ Windows'')本地設備路徑('\\。\ Pipe'或'\\?\ GlobalRoot \ SystemRoot')。只需推出自己的版本並在其上構建「PathIsRelative」。 – eryksun 2014-10-01 18:55:29