2010-02-19 2 views
11

У меня есть папка с слишком большим количеством файлов, и я хочу просматривать каждый файл по одному. Проблема в том, что Directory.GetFiles возвращает завершенный массив, и это занимает слишком много времени.Имейте Directory.GetFiles возвращать один файл за раз? (.NET)

Я бы предпочел иметь объект, который я бы указал на папку, а затем вызвать функцию, которая возвращает мне следующий файл в папке. Есть ли у .NET такой класс, пожалуйста?

(я бы предпочел, чтобы избежать win32 interops, как я планирую использовать это на Mono, а также.)

Большое спасибо.

ответ

8

Вы не можете сделать это в .NET 3.5, но вы можете в .NET 4.0, as per this blog post:

DirectoryInfo directory = new DirectoryInfo(@"\\share\symbols"); 
IEnumerable<FileInfo> files = directory.EnumerateFiles(); 
foreach (var file in files) { 
    Console.WriteLine("Name={0}, Length={1}", file.Name, file.Length); 
} 

(. Точно так же там статический метод Directory.EnumerateFiles)

Я не знаю, был ли этот API уже перенесен в Mono.

+0

вопрос, почему бы не использовать: var files = directory.EnumerateFiles(); ? –

+1

@Filip: Я не знаю о причинах Джона, но я бы использовал имя типа для ясности, так как от имени метода не очевидно, какой тип он возвращает. –

+0

@Fredrik, разве не ясно, что он вернет список нумерованных файлов? Имя метода действительно самоочевидно. То же самое касается DirectoryInfo, я бы предпочел использовать var directory = ... Я знаю, что есть разница во время компиляции. –

1

Посмотрите на проект FastDirectoryEnumerator на веб-сайте CodeProject.

Он делает именно то, что вам нужно, и даже больше, я смог успешно использовать его на медленном сетевом ресурсе с большим количеством файлов, и производительность была просто великолепной.

Недостаток - он использует interop, поэтому он не может быть портативным для Mono.

+0

Спасибо, я могу закончить с этим, но возвращаться к Directory.GetFiles, если он выдает исключение interop, указывая, что я, вероятно, не на win32. – billpg

+1

Вы можете использовать 'Environment.OSVersion', чтобы определить, работаете ли вы под Windows или нет, и найдите другой код, который будет работать быстро в той операционной системе, на которую вы нацеливаетесь. –

 Смежные вопросы

  • Нет связанных вопросов^_^