2015-07-24 4 views
2

Я пишу приложение C# с .NET 4 для чтения и обработки файлов данных (* .dat) из списка каталогов.Быстрый ввод-вывод, чтобы проверить, содержит ли каталог файлы

В настоящее время, я проверяю, если каталог содержит файлы с помощью следующей функции:

private bool FilesPresent() 
    { 
     string[] DIRS = Directory.GetDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly); 
     foreach (string d in DIRS) 
     { 
      string[] FILES = Directory.GetFiles(d, "*.*", SearchOption.AllDirectories); 
      if (FILES.Length > 0) { return true; } 
     } 
     return false;     
    } 

Я также попробовал некоторые альтернативные решения из следующего поста: How to quickly check if folder is empty (.NET)?

Важно отметить, что некоторые из каталогов имеют более 1 000 000 файлов. Даже чтение миллионов имен файлов в строку [] занимает много времени.

Как я могу реализовать это по-другому, чтобы он работал быстрее?

Проведение просто; Я просто хотел бы узнать самый быстрый способ проверить, не каталог ли пуст. В настоящее время я не заинтересован в получении имен файлов.

+0

Возможный дубликат [Как быстро проверить, пуста ли пустая (.NET)?] (Http://stackoverflow.com/questions/755574/how-to-quickly-check-if-folder-is-empty- net) – Haris

+0

Я не думаю, что вы получите быстрее, чем лучший ответ в этом дубликате. Почему это не подходит? – Sayse

+0

'Directory.EnumerateDirectories (dataFileDirectoryPath," *. * ", SearchOption.TopDirectoryOnly). Любой (d => Directory.EnumerateFiles (d," *. * ", SearchOption.AllDirectories) .Any())' –

ответ

3

Вот еще один подход с использованием LINQ и EnumerateFileSystemEntries + AllDirectories:

bool noFiles = !Directory.EnumerateFileSystemEntries(dataFileDirectoryPath, "*.*", SearchOption.AllDirectories) 
    .Any(entry => !File.GetAttributes(entry).HasFlag(FileAttributes.Directory)); 

Если FileAttribute.HasFlag(FileAttributes.Directory) возвращает false это файл.

+0

Ничего себе! Теперь это намного быстрее! Большое спасибо за ваш ответ, это очень ценится. –

6

Начиная с .NET 4.0 существует два метода: EnumerateDirectories/EnumerateFiles, которые лениво перечисляют каталоги/файлы.

private static bool FilesPresent() 
{ 
    IEnumerable<string> dirs = Directory.EnumerateDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly); 
    foreach (string d in dirs) 
    { 
     IEnumerable<string> files = Directory.EnumerateFiles(d, "*.*", SearchOption.AllDirectories); 
     if (files.Any()) { return true; } 
    } 
    return false; 
} 

Технически можно переписать как:

private static bool FilesPresent() 
{ 
    IEnumerable<string> dirs = Directory.EnumerateDirectories(dataFileDirectoryPath, "*.*", SearchOption.TopDirectoryOnly); 
    return dirs.Any(d => Directory.EnumerateFiles(d, "*.*", SearchOption.AllDirectories).Any()); 
} 

Но я чувствую, что это сделало бы его более непроницаемым.

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