0

利用可能な .NETSystem.IOメソッド/クラスのうち、リモート ネットワーク共有上のディレクトリ リスト全体を取得する最も効率的な方法は何ですか?

10,000 以上のファイルの場合、以下を取得する必要があります。

  1. 名前
  2. サイズ
  3. 最終更新日
  4. 作成日

この情報を取得するためにオブジェクトをループするのにかかるFileInfo時間と、Windows エクスプローラーが同じものを表示できる時間とでは、パフォーマンスに大きな違いがあるようです。

4

2 に答える 2

7

はい、これは.NET1.0でFileInfoクラスに対して行われた設計上の選択の副作用です。FileInfoオブジェクトが構築されるときにプロパティ値を格納せず、プロパティゲッターを使用するときにファイルから取得されます。そうすれば、常にプロパティの最新の値を取得できます。もちろん、サイズと日付のプロパティにとって非常に重要なのは、簡単に変更できることです。ただし、ネットワークを介したラウンドトリップは遅くなります。

.NET 4では、DirectoryInfo.EnumerateXxxx()メソッドが追加されて解決されました。列挙子に重点を置くことで、ファイル情報の潜在的に古いコピーを取得したことが明らかになりました。しかし、往復を避けてください。

.NET 4を使用できる場合は、問題を解決します。使用できない場合は、FindFirstFile、FindNextFile、FindCloseをピンボークする必要があります。

于 2011-09-30T20:16:03.807 に答える
2

最高のパフォーマンスを得るには、おそらくFindFirstFileFindNextFileGetFileAttributesExGetFileSizeExなどの Win32 API を使用することをお勧めします。

Win32 呼び出しを避けたい場合、Directory.EnumerateFiles は Directory.GetFiles よりも効率的です。これは、より効率的な Win32 API を内部的に使用する可能性があるため、要求に応じてファイルを遅延列挙するためです。ただし、ネットワークを経由しているため、実際には Directory.GetFiles を呼び出して一度にすべてを取得したい場合があります。実験。

于 2011-09-30T20:09:10.920 に答える