2つのファイルがあるディレクトリがあります。
- file1.xls
- file2.xlsx
私が行った場合:
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
両方のファイルが返されますが、最初のファイル(file1.xls)のみが必要です。これどうやってするの?
ありがとうございました!
2つのファイルがあるディレクトリがあります。
私が行った場合:
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
両方のファイルが返されますが、最初のファイル(file1.xls)のみが必要です。これどうやってするの?
ありがとうございました!
DirectoryInfo
内部的には、クラスはWin32呼び出しを使用しているように見えますFindFirstFile
。
これにより、ワイルドカードのみが許可されます。
*
任意の文字に一致する
?
0文字以上に一致させる-コメントを参照してください。
したがって、おそらく以下を使用して、結果を自分でフィルタリングする必要があります。
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
.Where(fi => fi.Extension == ".xls");
これは実際には予想される動作です。奇妙ですが、文書化されています。
MSDNで、コメントを読むことができます。
searchPatternで「*.txt」などのアスタリスクのワイルドカード文字を使用する場合、拡張子が正確に3文字の場合の一致動作は、拡張子が3文字より多いまたは短い場合とは異なります。ファイル拡張子が正確に3文字のsearchPatternは、拡張子が3文字以上のファイルを返します。最初の3文字は、searchPatternで指定されたファイル拡張子と一致します。ファイル拡張子が1文字、2文字、または3文字を超えるsearchPatternは、searchPatternで指定されたファイル拡張子と正確に一致する長さの拡張子を持つファイルのみを返します。疑問符のワイルドカード文字を使用する場合、このメソッドは、指定されたファイル拡張子に一致するファイルのみを返します。たとえば、「file1.txt」と「file1」の2つのファイルがあるとします。
IEnumerable.First()
、IEnumerable.FirstOrDefault()
拡張メソッドを使用できます。または、パターンが重要な場合は、列挙型検索パターンを修正してください。
このようなもの:
directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
.Where( f => Path.GetExtension( f ) == ".xls" );
これは.Except()を使用して機能し、より高速になるはずです。
var dir = new DirectoryInfo(myFolderPath);
ICollection<FileInfo> files = dir.EnumerateFiles("*.xls").Except(dir.EnumerateFiles("*.xls?")).ToList();
Union(s)を使用して、さらに拡張機能を追加できます。これは全体的にクリーンです(テストはしていませんが、高速だと思います)。IMO