2011-10-27 80 views
4

花了我一段時間在我的代碼中找到這個錯誤。試圖創建一個臨時測試目錄:爲什麼System.IO以這種方式實現

Path.Combine("C:", "test"); 
Directory.CreateDirectory(path); 

所以這創建目錄C:\test。它似乎只是在執行程序集的本地文件夾中創建目錄test

這是因爲Path.Combine("C:", "test");返回C:test,而不是C:\test

我不會假裝對文件系統有所瞭解,所以也許這個原因應該是顯而易見的,但我不明白。我不知道他們爲什麼以這種方式實施Path,或者爲什麼CreateDirectory不會抱怨無效的目錄名稱。

回答

11

那麼,你正在合併驅動器號和名稱。在Windows下,這意味着「該驅動器當前目錄下的名稱」。例如:

C:\> cd foo 
c:\foo> d: 
d:\> mkdir c:bar 

這將創建c:\foo\bar。所以它與Windows的設計(回到MS-DOS)似乎一致 - 對我來說這不一定是一個明智的設計,但對於.NET來說,它與它是一致的。

+0

這是更多的MS-DOS 2,1982年或大約設計。 –

+0

@HenkHolterman:好點,會編輯。 –

+0

哇。非常奇怪。那麼,這是有道理的,在一個「我不知道你可以做到這一點」有點方式。 – fearofawhackplanet

9

Path.Combine行爲這種方式,因爲:是一個有效的VolumeSeparatorChar - 所以\不會被追加到C:

從MSDN - Path.Combine Method (String, String)

如果PATH1不是驅動基準(即, 「C:」 或 「d」),並作爲在DirectorySeparatorChar定義不具有有效分隔字符結尾,在串聯之前,AltDirectorySeparatorChar或VolumeSeparatorChar,DirectorySeparatorChar被附加到path1。

至於CreateDirectory的行爲 - 參見Jon Skeet的the answer

相關問題