19

GetFilesのメソッドの文書化されていない動作に遭遇しましたSystem.IO.Directory

searchPatternメソッドに渡されるパラメーターに、またはなどの予約済みのWindowsデバイス名が含まれている場合は常に、メソッドは、またはなどの"nul.*"存在し"aux.bmp"ないファイルの名前を含む配列を返します。C:\Users\ft1\nulD:\aux

それらのデバイス名には、「。」のようなそのコンテキストに特別な意味があるのだろうか。または「..」、またはこれが単なるバグの一種である場合。とにかく、それはまだかなり奇妙に思えます。たとえば、C#の次のコードスニペット:

string[] fileNames = Directory.GetFiles(@"C:\D:\..\..\...\", "con.txt");
foreach (string fileName in fileNames) Console.WriteLine(fileName);

プリント

C:\D:\..\..\...\con

手がかりはありますか?

4

3 に答える 3

28

これは知られています。これは、ファイル、パス、および名前空間の命名に関するオペレーティング システムの設計です(Windows)。

抜粋:

ファイルの名前に次の予約名を使用しないでください: CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、 LPT6、LPT7、LPT8、LPT9。また、これらの名前の直後に拡張子を付けることも避けてください。たとえば、NUL.txt は推奨されません。詳細については、名前空間を参照してください。

これらは基本的にファイル名のエイリアス (名前空間) であるため、常にグローバルに (すべてのフォルダーに) 存在します。それらを列挙しようとすると、それらが存在するため、それらが返されます。

于 2012-12-31T17:39:30.987 に答える
10

これらはMSDOS/NTFSによって予約語です。

ウィキペディアから:

さらに、WindowsおよびDOSユーティリティでは、一部の単語も予約されており、ファイル名として使用できない場合があります。たとえば、DOSデバイスファイル:

CON, PRN, AUX, CLOCK$, NUL
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.

これらの制限があるシステムは、他のいくつかのファイルシステムとの非互換性を引き起こします。たとえば、Windowsは、次の有効なUNIXファイル名(aux.c、q "uote" s.txt、またはNUL.txt)の処理に失敗するか、エラーレポートを生成します。

内部で使用されるNTFSファイル名は次のとおりです。

$Mft, $MftMirr, $LogFile, $Volume, $AttrDef, $Bitmap, $Boot, $BadClus, $Secure,
$Upcase, $Extend, $Quota, $ObjId and $Reparse
于 2012-12-31T17:40:36.327 に答える
0

これに対する補遺として、MSTestdll で json 構成ファイルを使用するときに関連する問題がありました。私がそれを呼んだとき、それTest_Settings_Develop.jsonDirectory.GetFiles見つけたが、それが存在しないと言ったので、それを読み込もうとしてテストを実行できませんでした。

名前を TestSettings_Develop.json に変更すると、機能しました。

于 2020-03-02T11:23:18.587 に答える