Phoenixz
Lieutenant
- Registriert
- März 2004
- Beiträge
- 595
Hallo CB-Community,
ich komme gleich auf den Punkt. Mir geht es um eine eigene Implementierung eines Kopiervorgangs für Dateien (Also nicht etwa die Verwendung der Windows-Kopierfunktion). Ich würde das ganze gerne auf Pseudocode Niveau halten, da es mir nur um die Theorie geht und die ist ja bekanntlich Sprachenunabhängig.
Also nun zu meiner Frage: Das Kopieren von Dateien kann man auf das „Grundproblem“ herunterbrechen, den Inhalt eines (Quell-)Streams in ein (Ziel-)Stream zu schreiben. Ein einfacher Lösungsansatz würde dabei wie folgt vorgehen:
(Ok, das ist nicht gerade Pseudo Code, doch das sollte hoffentlich auch verständlich sein. Halt ganz normales paketweises kopieren).
Was mir jetzt aber aufgefallen ist, ist die Tatsache, dass man immer einen Wechsel hat zwischen Lesen und Schreiben.
Also habe ich mir heute überlegt ob es nicht effizienter wäre das Ganze auf zwei Threads zu verteilen. Der eine liest ständig in eine Queue (ggf. noch beschränken auf maximale Anzahl der Pakete) und der andere nimmt sich immer ein Paket aus der Queue raus und schreibt es in den Zielstream. Liegt Quelldatei und Zielverzeichnis (bzw. Zieldatei) auf der gleichen Festplätte würde das zwar nicht so viel bringen (da die Festplatte ja kein gleichzeitiges Lesen und Schreiben ermöglicht), aber wenn dies nicht der Fall ist (also die Dateien auf unterschiedlichen Festplatten liegen) müsste doch ein Geschwindigkeitsvorteil vorhanden sein.
Ich konnte leider keine Informationen zum Thema finden, „Wie implementiert man das Kopieren von Dateien richtig“ ^^. Sind also meine Gedankengänge korrekt und empfiehlt sich eine Multithreading-Lösung zum Kopieren?
Vielen Dank,
Daniel
ich komme gleich auf den Punkt. Mir geht es um eine eigene Implementierung eines Kopiervorgangs für Dateien (Also nicht etwa die Verwendung der Windows-Kopierfunktion). Ich würde das ganze gerne auf Pseudocode Niveau halten, da es mir nur um die Theorie geht und die ist ja bekanntlich Sprachenunabhängig.
Also nun zu meiner Frage: Das Kopieren von Dateien kann man auf das „Grundproblem“ herunterbrechen, den Inhalt eines (Quell-)Streams in ein (Ziel-)Stream zu schreiben. Ein einfacher Lösungsansatz würde dabei wie folgt vorgehen:
Code:
Lese X Bytes aus dem Quellstream in ein Buffer,
schreibe anschließend den Buffer in den Zielstream.
Wiederhole diesen Vorgang solange noch Bytes im Quellstream zu lesen sind.
Was mir jetzt aber aufgefallen ist, ist die Tatsache, dass man immer einen Wechsel hat zwischen Lesen und Schreiben.
Also habe ich mir heute überlegt ob es nicht effizienter wäre das Ganze auf zwei Threads zu verteilen. Der eine liest ständig in eine Queue (ggf. noch beschränken auf maximale Anzahl der Pakete) und der andere nimmt sich immer ein Paket aus der Queue raus und schreibt es in den Zielstream. Liegt Quelldatei und Zielverzeichnis (bzw. Zieldatei) auf der gleichen Festplätte würde das zwar nicht so viel bringen (da die Festplatte ja kein gleichzeitiges Lesen und Schreiben ermöglicht), aber wenn dies nicht der Fall ist (also die Dateien auf unterschiedlichen Festplatten liegen) müsste doch ein Geschwindigkeitsvorteil vorhanden sein.
Ich konnte leider keine Informationen zum Thema finden, „Wie implementiert man das Kopieren von Dateien richtig“ ^^. Sind also meine Gedankengänge korrekt und empfiehlt sich eine Multithreading-Lösung zum Kopieren?
Vielen Dank,
Daniel