Ich führe eine .bat-Datei aus, die Folgendes enthält:
robocopy \\server\directory\ .\localdir /MIR
Dadurch wird eine einzelne Datei von einem Server in mein lokales Verzeichnis verschoben.
Es ist eine große Datei und es wird eine Weile dauern, bis sie fertig ist. Mit einer vorhandenen Kopie der Datei an diesem Speicherort kann ich jedoch das erreichen, was ich brauche.
Wann genau wird die Datei überschrieben? Kann ich die Datei verwenden, die sich vor dem Start der .bat-Datei in \ localdir befand? Oder muss ich warten, bis der Kopiervorgang abgeschlossen ist?
Antworten:
robocopy
unterscheidet sich nicht von anderen Dateikopierprogrammen. Eine überschreibende Kopie "schneidet" die vorhandenen Daten in der Datei ab und beginnt dann mit dem Schreiben der neuen Daten. Sie können dies mit einem Programm beobachten, das die von robocopy aufgerufenen System-APIs überwacht, z. B. eine der hier aufgeführten Optionen . Dann müssen Sie nur jeden API-Aufruf auf MSDN nachschlagen, um genau zu verstehen, was passiert.Zuerst ruft es SetFilePointerEx auf, um nach dem Anfang der Datei zu suchen (falls nicht bereits vorhanden). Dann ruft es SetEndOfFile auf, um die Datei auf den BOF-Marker zu kürzen (wodurch eine Null-Byte-Datei entsteht). Dies geschieht alles so schnell, dass Ihre ursprünglichen Dateidaten, sobald der Befehl ausgeführt wird, in jeder Hinsicht "verloren" gehen (die Blöcke, die den Datenstrom der Datei darstellten, werden sehr bald durch zukünftige NTFS-Schreibvorgänge ganz oder teilweise überschrieben) Befehle).
Wenn Sie dies "atomar" tun möchten, können Sie eine Umbenennungsoperation wie die folgende ausführen:
Kopieren Sie den Inhalt der Datei (mit Robocopy) vom Server auf einen eindeutigen Pfad auf dem lokalen System , das sich nicht zur Zeit existieren (zum Beispiel, wenn die Datei mit dem Namen ist
foo
, Sie kopieren könnte esfoo.bak
.)Führen Sie eine Überschreibungsumbenennung mit der Windows-API-Funktion zum atomaren Umbenennen durch, die in Windows Vista hinzugefügt wurde (und daher unter XP und früheren Versionen nicht unterstützt wird, für die eine nicht atomare, möglicherweise fehlerhafte oder fehlerhafte , nicht atomare Umbenennung erforderlich ist; autsch): MoveFileTransacted () . Auf diese Weise können Sie die in der Datei enthaltenen Daten sofort "auslagern", und zwar vom Inhalt der Originaldatei zum Inhalt der neuen Datei. Dies bedeutet, dass kein Programm jemals eine teilweise vollständige Datei lesen kann - entweder die (vollständige, unveränderte) Originalkopie oder die vollständige, unveränderte aktualisierte Kopie. Es wird niemals eine "unvollständige" Kopie oder eine verstümmelte Kombination beider Dateien gelesen.
Die Nachteile dieser alternativen Methode sind:
quelle