12

次の行を使用して特定のファイルを返しています...

FileInfo file in nodeDirInfo.GetFiles("*.sbs", option)

しかし、拡張子が のディレクトリには他のファイルがあり、.sbsarそれらも取得しています。検索パターンで.sbsとを区別するにはどうすればよいですか?.sbsar

4

4 に答える 4

9

発生している問題は、Win32 API での検索パターンの制限です。

正確に 3 文字のファイル拡張子 (*.txt など) を持つ searchPattern は、3 文字以上の拡張子を持つファイルを返します。最初の 3 文字は、searchPattern で指定されたファイル拡張子と一致します。

私の解決策は、Linq を使用して手動で結果をフィルター処理することです。

nodeDirInfo.GetFiles("*.sbs", option).Where(s => s.EndsWith(".sbs"),
    StringComparison.InvariantCultureIgnoreCase));
于 2013-11-27T11:18:40.260 に答える
7

ファイル拡張子を使用してフィルタリングして、これを試してください。

  FileInfo[] files = nodeDirInfo.GetFiles("*", SearchOption.TopDirectoryOnly).
            Where(f=>f.Extension==".sbs").ToArray<FileInfo>();
于 2013-11-27T11:30:58.287 に答える
5

FindFirstFileこれは、下GetFiles()に反映されているWin32 API ( ) の動作です。

を使用する必要がある場合は、独自のフィルタリングを行う必要がありますGetFiles()。例えば:

GetFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

またはより効率的に:

EnumerateFiles("*", searchOption).Where(s => s.EndsWith(".sbs", 
    StringComparison.InvariantCultureIgnoreCase));

StringComparison.InvariantCultureIgnoreCaseWindows のファイル名では大文字と小文字が区別されないことに注意してください。

パフォーマンスが問題になる場合、つまり検索で多数のファイルを含むディレクトリを処理する必要がある場合は、フィルタリングを 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));
于 2013-11-27T11:17:47.393 に答える
0

ドキュメントに記載されています

searchPattern でアスタリスク ワイルドカード文字を使用する場合、正確に 3 文字のファイル拡張子を持つ searchPattern は、3 文字以上の拡張子を持つファイルを返します。疑問符ワイルドカード文字を使用する場合、このメソッドは指定されたファイル拡張子に一致するファイルのみを返します。 .

于 2013-11-27T11:20:11.947 に答える