Самый быстрый способ .NET получить наибольшее количество метаданных из файлов в удаленном сетевом ресурсе? - PullRequest
0 голосов
/ 30 сентября 2011

Из доступных методов / классов .NET System.IO, каков наиболее эффективный способ получения полного списка каталогов на удаленном сетевом ресурсе (предположим, медленное соединение без локальной сети)?

Для 10 000+ файлов необходимо получить:

  1. Имя
  2. Размер
  3. Дата последнего изменения
  4. Дата создания

Кажется, что существует огромная разница в производительности за время, необходимое для циклического перебора FileInfo объектов для этой информации, по сравнению с количеством времени, в течение которого проводник Windows может отображать одно и то же.

Ответы [ 2 ]

7 голосов
/ 01 октября 2011

Да, это побочный эффект выбора дизайна, сделанного в .NET 1.0 для класса FileInfo.Он не сохраняет значения свойств при создании объекта FileInfo, он извлекается из файла при использовании метода получения свойства.Таким образом, вы всегда получаете актуальную стоимость недвижимости.Что, конечно, имеет большое значение для свойств размера и даты, они легко изменяются.Обход через сеть, однако, делает его медленным.

Это было решено в .NET 4 с добавленными методами DirectoryInfo.EnumerateXxxx ().Акцент на перечислителе сделал очевидным, что вы получили потенциально устаревшую копию информации о файле.Но избегая двусторонней передачи.

Решает вашу проблему, если вы можете использовать .NET 4. Вам нужно будет вводить FindFirstFile, FindNextFile, FindClose, если вы не можете.

2 голосов
/ 01 октября 2011

Для лучшей производительности вы, вероятно, захотите использовать Win32 API, такие как FindFirstFile , FindNextFile , GetFileAttributesEx и GetFileSizeEx .

Если вы хотите избежать вызовов Win32, Directory.EnumerateFiles более эффективен, чем Directory.GetFiles, потому что он лениво перечисляет файлы по их запросу, которые могут внутренне использовать более эффективные Win32 API. Однако, так как вы работаете по сети, вы можете вызвать Directory.GetFiles, чтобы получить их все сразу. Эксперимент.

...