2012-06-13 112 views
5

我運行一個非常簡單的程序,這是試圖列出在同一臺機器,這是使用UNC格式(如http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx描述)指定的文件夾中的文件:UNC路徑不適用於.NET?


static string rootDir = @"\\?\d:\share\input";

static void Main(string[] args) { char[] invlidChars = Path.GetInvalidPathChars(); foreach (char invChar in invlidChars) { if (rootDir.Contains(invChar.ToString())) { Console.WriteLine("InvChar - {0}", invChar); } } string[] matchFiles = Directory.GetFiles(rootDir); }

然而Directory.GetFiles()不起作用並拋出一個ArgumentException(當 - 路徑爲零長度字符串,僅包含空格或包含InvalidPathChars定義的一個或多個無效字符時引發此異常。)。 Console.Writeline()不打印任何內容,確認路徑中沒有無效字符。當我使用 「\\ UNC \?\ d:\ share \ input」或 「\\ UNC \?\ machinename \ share \ input」或 「\\?\ machinename \ share \ input 」。

「d:\ share \ input」確實是一個共享文件夾。

有人知道什麼可能是錯的嗎?

謝謝!

+0

我推薦這個舊的但仍然相關的長路徑概述,MAXPATH限制,\\?\前綴和其他.NET問題:http://blogs.msdn.com/b/bclteam/archive/2007/02/ 13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx –

+0

感謝鏈接Avner SK;這闡明瞭長路徑的.NET和Windows-API的行爲。 – whywhywhy

回答

8

問題是\\?\是.NET不支持的Windows API約定。如果您在您的鏈接仔細閱讀\\?\不表示UNC路徑,但對於Windows API的特別約定:

對於文件I/O,在「\\?\」前綴的路徑字符串告訴Windows的 的API禁用所有字符串解析並將它跟在 之後的字符串直接發送到文件系統。

NET兼容的UNC格式將是\\machinename\d$\share\input。有關更多信息,請參閱this回答。

.NET不支持的原因很可能是擴展路徑約定在所有平臺上都不可用,因此無法保證該框架能夠正常工作。

+0

感謝Mike Z的迴應。正如你指出的那樣\\?\不是UNC的一部分,而是Windows的特定部分。這回答了這個問題! – whywhywhy