次の行を使用して特定のファイルを返しています...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
しかし、拡張子が のディレクトリには他のファイルがあり、.sbsar
それらも取得しています。検索パターンで.sbs
とを区別するにはどうすればよいですか?.sbsar
次の行を使用して特定のファイルを返しています...
FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)
しかし、拡張子が のディレクトリには他のファイルがあり、.sbsar
それらも取得しています。検索パターンで.sbs
とを区別するにはどうすればよいですか?.sbsar
発生している問題は、Win32 API での検索パターンの制限です。
正確に 3 文字のファイル拡張子 (*.txt など) を持つ searchPattern は、3 文字以上の拡張子を持つファイルを返します。最初の 3 文字は、searchPattern で指定されたファイル拡張子と一致します。
私の解決策は、Linq を使用して手動で結果をフィルター処理することです。
nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
StringComparison.InvariantCultureIgnoreCase));
ファイル拡張子を使用してフィルタリングして、これを試してください。
FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
FindFirstFile
これは、下GetFiles()
に反映されているWin32 API ( ) の動作です。
を使用する必要がある場合は、独自のフィルタリングを行う必要がありますGetFiles()
。例えば:
GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
またはより効率的に:
EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
StringComparison.InvariantCultureIgnoreCase
Windows のファイル名では大文字と小文字が区別されないことに注意してください。
パフォーマンスが問題になる場合、つまり検索で多数のファイルを含むディレクトリを処理する必要がある場合は、フィルタリングを 2 回実行する方が効率的です。1 回目はGetFiles
またはの呼び出しEnumerateFiles
で、もう 1 回は不要なファイル名をクリーンアップするためです。例えば:
GetFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
EnumerateFiles("*.sbs", searchOption).Where(s => s.EndsWith(".sbs",
StringComparison.InvariantCultureIgnoreCase));
ドキュメントに記載されています
searchPattern でアスタリスク ワイルドカード文字を使用する場合、正確に 3 文字のファイル拡張子を持つ searchPattern は、3 文字以上の拡張子を持つファイルを返します。疑問符ワイルドカード文字を使用する場合、このメソッドは指定されたファイル拡張子に一致するファイルのみを返します。 .