2016-07-07 10 views
0

Ich habe eine Liste der Zeichenfolge, die relative Pfade sind. Ich habe auch eine Zeichenfolge, die Root-Pfad für diese Dateien enthält. Jetzt habe ich sie so bin zu löschen:Schnellste Möglichkeit, Millionen von Dateien zu löschen

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

das Problem ist, dass ich Path.Combine für jede Datei aufrufen, und es ist langsam genug. Wie kann ich diesen Code beschleunigen? Ich kann nicht ganze Ordner löschen, ich kann das aktuelle Verzeichnis nicht ändern (weil es ein ganzes Programm betrifft) ...

Ich brauche so etwas wie eine Klasse, die schnell mehrere Dateien im angegebenen Verzeichnis löschen kann.

+2

sehen kann nicht alles, was Ihren Code verlangsamen würde, um den Engpass bei Dateioperationen unter normalen Bedingungen immer die E/A-Operationen . Sie könnten versuchen, hier Multi-Threading zu verwenden, z. documents.AsParallel(). ForAll() –

+0

@MichaelSander Ich weiß, aber Festplatte kann Löschvorgänge in Batches organisieren, wissen Sie, Befehlswarteschlangen und so weiter. –

+0

Wenn Sie wüssten, dass es "alles" von etwas ist, könnten Sie einen "* .doc" -Ansatz machen, aber wenn Sie etwas Bestimmtes tun müssen, sind Sie begrenzter – BugFinder

Antwort

1

Wenn die Festplatte kann damit umgehen, parallizing viel helfen soll:

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

Nun, ForAll + native FileDelete scheint hier eine Antwort zu sein. Interessant, some1 downvoted, aber nicht darüber geschrieben, warum :) Manche Leute sind wirklich seltsam ... –