Мне нужно получить файлы из каталога на 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 минут.
Есть ли способ получить только несколько файлов (например, самый старый) или что-то другое быстрее?
Благодарю! Приветствую Кристофа
Вы можете попробовать использовать метод 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 может быть более эффективным.
Вместо этого используйте 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();