2

すべてのWord文書のリストを取得する必要があります。*.docおよび*.docxは、多くのサブフォルダー、サブサブフォルダーなどを含むWindowsベースのフォルダーに保存されます。

C#でファイルを検索すると、うまくいく答えがあります。2年前で、1500個のファイルを検索するのに10秒かかります(将来的には10,000個以上になる可能性があります)。基本的に上記のリンクからのコピーである私のコードを投稿します。誰かがより良い解決策を持っていますか?

DateTime dt = DateTime.Now;
DirectoryInfo dir = new DirectoryInfo(MainFolder);
List<FileInfo> matches = 
          new List<FileInfo>(dir.GetFiles("*.doc*",SearchOption.AllDirectories));
TimeSpan ts = DateTime.Now-dt;
MessageBox.Show(matches.Count + " matches in " + ts.TotalSeconds + " seconds");
4

4 に答える 4

5

の代わりにDirectory.EnumerateFilesを使用できますGetFiles。これには、ファイルをとして返すという利点がありますIEnumerable<T>。これにより、(リスト全体が返されるのを待つのではなく)結果セットの処理をすぐに開始できます。

ファイルの数を数えたり、すべてのファイルを一覧表示したりするだけでは、役に立たない場合があります。ただし、結果の処理やフィルタリングを実行できる場合、特に他のスレッドで実行できる場合は、大幅に高速化できます。

ドキュメントから:

EnumerateFilesメソッドとGetFilesメソッドは、次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に、名前のコレクションの列挙を開始できます。GetFilesを使用する場合、配列にアクセスする前に、名前の配列全体が返されるのを待つ必要があります。したがって、多くのファイルやディレクトリを操作している場合は、EnumerateFilesの方が効率的です。

于 2012-05-15T16:25:11.790 に答える
2

それでできることはたくさんあるのではないでしょうか。

dir.GetFiles("*.doc|*.docx", SearchOptions.AllDirectories)より制限的なパターンであるという点で影響があるかもしれません。

于 2012-05-15T16:29:27.043 に答える
1

完全なリストが必要な場合は、ターゲットフォルダーでWindowsインデックスサービスが有効になっていることを確認する以外は、実際にはそうではありません。主な遅延はハードドライブからの読み取りであり、C#コードを最適化してもそのプロセスはこれ以上速くなりません。おそらくFileSystemWatcherを使用して、独自の単純なインデックス作成サービスを作成できます。これにより、追加されたドキュメントの数に関係なく、1秒未満の応答時間が得られます。

于 2012-05-15T16:27:34.890 に答える
1

初めて、経過時間を取得するためにDateTimeの代わりにStopWatchを使用することをお勧めします。
2回目は、検索を高速化するために、GetFilesの結果をリストに保存するのではなく、直接配列に保存する必要があります。
そして最後に、検索パターンを最適化する必要があります。すべてのdocファイルとdocxファイルが必要な場合は、「*。doc?」を試してください。
これが私の提案です:

var sw = new Stopwatch();
sw.Start();

var matches = Directory.GetFiles(MainFolder, "*.doc?", SearchOption.AllDirectories);

sw.Stop();
MessageBox.Show(matches.Length + " matches in " + sw.Elapsed.TotalSeconds + " seconds");
于 2012-05-15T16:35:55.260 に答える