利用可能な .NETSystem.IO
メソッド/クラスのうち、リモート ネットワーク共有上のディレクトリ リスト全体を取得する最も効率的な方法は何ですか?
10,000 以上のファイルの場合、以下を取得する必要があります。
- 名前
- サイズ
- 最終更新日
- 作成日
この情報を取得するためにオブジェクトをループするのにかかるFileInfo
時間と、Windows エクスプローラーが同じものを表示できる時間とでは、パフォーマンスに大きな違いがあるようです。
はい、これは.NET1.0でFileInfoクラスに対して行われた設計上の選択の副作用です。FileInfoオブジェクトが構築されるときにプロパティ値を格納せず、プロパティゲッターを使用するときにファイルから取得されます。そうすれば、常にプロパティの最新の値を取得できます。もちろん、サイズと日付のプロパティにとって非常に重要なのは、簡単に変更できることです。ただし、ネットワークを介したラウンドトリップは遅くなります。
.NET 4では、DirectoryInfo.EnumerateXxxx()メソッドが追加されて解決されました。列挙子に重点を置くことで、ファイル情報の潜在的に古いコピーを取得したことが明らかになりました。しかし、往復を避けてください。
.NET 4を使用できる場合は、問題を解決します。使用できない場合は、FindFirstFile、FindNextFile、FindCloseをピンボークする必要があります。
最高のパフォーマンスを得るには、おそらくFindFirstFile、 FindNextFile、GetFileAttributesEx、GetFileSizeExなどの Win32 API を使用することをお勧めします。
Win32 呼び出しを避けたい場合、Directory.EnumerateFiles は Directory.GetFiles よりも効率的です。これは、より効率的な Win32 API を内部的に使用する可能性があるため、要求に応じてファイルを遅延列挙するためです。ただし、ネットワークを経由しているため、実際には Directory.GetFiles を呼び出して一度にすべてを取得したい場合があります。実験。