Получение файлов из огромных каталогов на NetDrives

1

Мне нужно получить файлы из каталога на NetDrive. Проблема в том, что этот Dir может содержать файл 500K или более.

Обычные способы:

Directory.GetFiles(@"L:\cs\fromSQL\Data", "*.dat",
                                   SearchOption.TopDirectoryOnly);

или

DirectoryInfo dir = new DirectoryInfo(@"L:\cs\fromSQL\Data");
            var files = 
                dir.GetFiles("*.dat", SearchOption.TopDirectoryOnly)

уходят далеко вперед. Они всегда разбирают весь Справочник.

Пример: файлы NetDrive-Directory Containg ~ 130k, первый вариант занимает 15 минут.

Есть ли способ получить только несколько файлов (например, самый старый) или что-то другое быстрее?

Благодарю! Приветствую Кристофа

  • 0
    Вам все равно придется вызывать GetFiles, чтобы получить счет. Может быть другой путь, но я не знаю об этом. Я предполагаю, что Directory.EnumerateFiles займет столько же времени.
  • 0
    Да, вы правы, но мне, к счастью, не нужен счет
Теги:

2 ответа

3
Лучший ответ

Вы можете попробовать использовать метод DirectoryInfo.EnumerateFiles.

Поскольку msdn говорит: -

Returns an enumerable collection of file information in the current directory.

это IEnumerable, поэтому он может передавать записи, а не буферизировать их все

Например :-

foreach(var file in Directory.EnumerateFiles(path)) {
    // ...
}

Подробнее о MSDN: -

Методы EnumerateFiles и GetFiles различаются следующим образом: когда вы используете EnumerateFiles, вы можете начать перечисление коллекции объектов FileInfo до возвращения всей коллекции; когда вы используете GetFiles, вы должны дождаться возврата всего массива объектов FileInfo до того, как вы сможете получить доступ к массиву. Поэтому, когда вы работаете со многими файлами и каталогами, EnumerateFiles может быть более эффективным.

  • 0
    Спасибо! Поскольку я использовал .Net3.5 для тестирования этого, я не смог найти эти Функции Версии 4 (
2

Вместо этого используйте Directory.EnumerateFiles:

var count = Directory.EnumerateFiles(@"L:\cs\fromSQL\Data", "*.dat",
                               SearchOption.TopDirectoryOnly).Count();

Если вы хотите отфильтровать некоторые файлы, используйте DirectoryInfo.EnumerateFiles и отфильтруйте файлы, используя Where:

var di = new DirectoryInfo(@"L:\cs\fromSQL\Data");
var count = di.EnumerateFiles("*.dat",SearchOption.TopDirectoryOnly)
           .Where(file => /* your condition */)
           .Count();
  • 0
    Вы победили меня на 7 секунд!
  • 0
    спасибо за ваш ответ! Но на самом деле из моих тестов вы наполовину правы. Если я использую некоторые дальнейшие выражения Linq, такие как OrderBy или Где начинается программа, сначала захватите весь список. Это даже медленнее, чем GetFiles, чем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню