2012-06-19 13 views
5

Ich möchte einen Weg finden, eine Datei auf mehrere Standorte gleichzeitig (mit C#) zu kopieren.Wie eine Datei an verschiedenen Orten kopieren gleichzeitig

bedeutet, dass ich mag nicht die ursprüngliche Datei nur einmal gelesen werden, und auf „Einfügen“, um die Datei an einem anderen Standorte (im lokalen Netzwerk).

so weit wie meine Tests hat mir gezeigt, die

File.Copy() 

wird die Quelle wieder immer lesen.

und soweit ich verstehen, auch während der Speicher verwendet wird, wird das Speicherstück gesperrt.

also im Grunde mag ich die „copy-paste“ in die Form einer „Kopie“ und mehr „Paste“ imitieren, ohne Wieder Lesen von der Festplatte wieder.

Warum? weil schließlich ich einen Ordner (mehr als 1 GB) auf viele Computer kopieren muss, und der Engpass ist der Teil, den ich brauche, um die Quelldatei zu lesen.

So Ist es überhaupt möglich zu erreichen?

+2

http://www.java2s.com/Code/CSharp/File-Stream/illustratesuseofMemoryStreams.htm? – Holystream

+1

Haben Sie ein Problem damit, nur wissenschaftlich zu arbeiten oder Ihren Code vorzeitig zu optimieren? – ivowiblo

+0

@ivowiblo: Ich versuche, einen Prozess zu optimieren, der 2 Stunden dauert (15 Minuten für 10 Computer). Ich bin mir sicher, dass es einen besseren Weg von der "normalen" Kopie gibt. – itsho

Antwort

9

Anstatt mit der File.Copy Dienstprogramm Methode, könnten Sie die Quelldatei als FileStream öffnen, öffnen Sie dann so viele FileStreams zu jedoch viele Zieldateien, die Sie benötigen, aus der Quelle gelesen, und zu jedem Ziel Stream schreiben.

UPDATE Geändert, um Dateien mit Parallel.ForEach zu schreiben, um den Durchsatz zu verbessern.

public static class FileUtil 
{ 
    public static void CopyMultiple(string sourceFilePath, params string[] destinationPaths) 
    { 
     if (string.IsNullOrEmpty(sourceFilePath)) throw new ArgumentException("A source file must be specified.", "sourceFilePath"); 

     if (destinationPaths == null || destinationPaths.Length == 0) throw new ArgumentException("At least one destination file must be specified.", "destinationPaths"); 

     Parallel.ForEach(destinationPaths, new ParallelOptions(), 
         destinationPath => 
          { 
           using (var source = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
           using (var destination = new FileStream(destinationPath, FileMode.Create)) 
           { 
            var buffer = new byte[1024]; 
            int read; 

            while ((read = source.Read(buffer, 0, buffer.Length)) > 0) 
            { 
             destination.Write(buffer, 0, read); 
            } 
           } 

          }); 
    } 
} 

Verbrauch:

FileUtil.CopyMultiple(@"C:\sourceFile1.txt", @"C:\destination1\sourcefile1.txt", @"C:\destination2\sourcefile1.txt"); 
+0

Brilliant!. Ich werde es versuchen und werde wahrscheinlich als beantwortet markieren. – itsho

+0

Ich habe es heute versucht, aber es ist immer noch langsam (1480 Dateien, insgesamt 10 MB, für zwei Computer - dauerte etwa 4 Minuten). Bitte beachten Sie, dass Ihre Antwort DID nur einmal gelesen hat, aber trotzdem hat sie die Zeit nicht verschont. Ich werde es morgen profilieren und werde mit besserer Antwort zurückkommen. Wie auch immer, ich überlege Threads, eine parallele Kopie zu machen ... – itsho

+0

Tatsächlich liest es die Datei nur einmal, aber schreibt den Stream eine Datei nach der anderen. Vielleicht kann die Parallel-Programmier-API dabei helfen. Ich werde sehen, ob ich meine Antwort nachbearbeiten kann. – HackedByChinese

Verwandte Themen