2016-07-07 3 views
0

У меня есть список строк, которые являются относительными путями. У меня также есть строка, которая содержит корневой путь для этих файлов. Теперь я удалить их, как это:Самый быстрый способ удалить миллион файлов

foreach (var rawDocumentPath in documents.Select(x => x.RawDocumentPath)) 
{ 
    if (string.IsNullOrEmpty(rawDocumentPath)) 
    { 
     continue; 
    } 
    string fileName = Path.Combine(storagePath, rawDocumentPath); 
    File.Delete(fileName); 
} 

Проблема заключается в том, что я называю Path.Combine для каждого файла, и это достаточно медленно. Как я могу ускорить этот код? Я не могу удалить целые папки, я не могу изменить текущий каталог (потому что он влияет на целую программу) ...

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

+2

не может видеть ничего, что бы замедлить ваш код вниз, узкое место с файловыми операциями в обычных условиях всегда являются операциями ввода/вывода , Вы можете попробовать использовать многопоточность здесь, например. document.AAsParallel(). ForAll() –

+0

@MichaelSander Я знаю, но диск может организовывать удаление в пакетах, вы знаете, очереди команд и так далее. –

+0

Если вы знали, что это «все», то вы могли бы использовать подход типа «.doc», но когда вам нужно делать специфику .. вы более ограничены – BugFinder

ответ

1

Если ваш диск может справиться с этим, parallizing должна помочь много:

documents.AsParallel().ForAll(
    document => 
    { 
     if (!string.IsNullOrEmpty(document.RawDocumentPath)) 
     { 
      string fileName = Path.Combine(storagePath, document.RawDocumentPath); 
      File.Delete(fileName); 
     } 
    }); 
+0

Ну, ForAll + native FileDelete кажется ответом здесь. Интересно, некоторые из них 1 вниз, но не писали о том, почему :) Некоторые люди действительно странные ... –