8

UNC形式を使用して指定された同じマシン上のフォルダー内のファイルをリストしようとする非常に単純なプログラムを実行しています( http://msdn.microsoft.com/en-us/library/windows/で説明されているように)デスクトップ/aa365247%28v=vs.85%29.aspx ):


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 をスローします (パスが長さ 0 の文字列である、空白のみが含まれている、または InvalidPathChars で定義されている無効な文字が 1 つ以上含まれている場合にスローされます)。Console.Writeline() は何も出力しません。これは、パスに無効な文字がないことを確認します。「\\UNC\?\d:\share\input」または「\\UNC\?\machinename\share\input」または「\\?\machinename\share\input」を使用すると、同じ例外が発生します。

「d:\share\input」は確かに共有フォルダーです。

誰が何が間違っているのか知っていますか?

ありがとう!

4

1 に答える 1

9

問題は\\?\、Windows API 規則が .NET でサポートされていないことです。リンクを注意深く読む\\?\と、UNCパスを示していませんが、Windows APIの特別な規則です:

ファイル I/O の場合、\\?\パス文字列の " " プレフィックスは、すべての文字列解析を無効にし、それに続く文字列をファイル システムに直接送信するよう Windows API に指示します。

.NET 互換の UNC 形式は\\machinename\d$\share\input. 詳細については、この回答を参照してください。

.NET でサポートされていない理由は、拡張パス規則がすべてのプラットフォームで使用できるわけではないため、フレームワークで動作することが保証されていない可能性が高いためです。

于 2012-06-13T06:41:57.787 に答える