2012-12-31 17 views
19

GetFilesメソッドの文書化されていない動作が、System.IO.Directoryにありました。Directory.GetFilesに存在しないファイルが見つかりました

メソッドに渡さsearchPatternパラメータは、"nul.*"または"aux.bmp"として、予約済みのWindowsデバイス名が含まれているときはいつでも、方法等、C:\Users\ft1\nul又はD:\auxように、存在しないファイルの名前を含む配列を返し

Iそれらのデバイス名が "。"のようなそのコンテキストを特別な意味を持っているのだろうか。または ".."、またはこれが単なるバグであるかどうか。とにかく、それはまだかなり奇妙に思えます。例えば 、C#で、このコードスニペット:

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

プリント

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

任意の手がかり?

答えて

28

これは知られています。 CON、PRN、AUX、NUL、COM1、COM2、COM3、COM4:

は、ファイルの名前について、次の予約名を使用しないでください:それはNaming Files, Paths, and Namespaces (Windows)

抜粋に関するオペレーティングシステムの設計であります、COM5、COM6、COM7、COM8、COM9、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、およびLPT9である。また、これらの名前の直後に拡張子を付けることも避けてください。たとえば、NUL.txtはお勧めしません。詳細については、「名前空間」を参照してください。

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

+1

を.NET Frameworkは、このような予約名のいずれかの組み込みのリストを持っている場合、あなたは知っていますか? –

+6

それは良い質問ですが、おそらくそれは実際のSOの質問として、しかし質問[どのように指定された文字列が合法的(許可された)ファイル名Windowsでのチェックですか?](http://stackoverflow.com/questions/62771/given-string-legal-allowed-file-name-under-windows)のチェックが既に行われている場合、私はあなたにそのリンクを与えます。 –

+0

エリックありがとう! –

10

これらはMSDOS/NTFSによってreserved wordsです。 Wikipediaから

:また

は、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 
+0

ありがとう、私は予約済みのMSDOS名を知っていましたが、それらの内部NTFSファイル名は私には新しかったです。私は彼らも私のアプリケーションで問題を引き起こすかもしれないと思うので、彼らに見せなければなりません。 –

関連する問題