Ab wann überschreibt Robocopy eine Datei?

1

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?

StuperUser
quelle
Irgendein Grund für die Ablehnung? Gibt es eine Frage, die ich in den Dokumenten nicht gefunden habe?
StuperUser

Antworten:

1

robocopyunterscheidet 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:

  1. 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 es foo.bak.)

  2. 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:

  • Ich kenne kein Programm, das dies bereits im Auslieferungszustand erledigt.
  • Da die Originaldatei beim Kopieren noch vorhanden ist, ist doppelt so viel Speicherplatz erforderlich. Wenn Sie also beabsichtigen, eine 1-GiB-Datei mit einer anderen 1-GiB-Datei zu überschreiben, benötigen Sie insgesamt 2 GiB Speicherplatz auf Ihrem lokalen System, wenn auch nur vorübergehend.
  • Es funktioniert nur mit Transactional NTFS. Das heißt, wenn Ihr Quell- oder Zieldateisystem für das Überschreiben von Transaktionen nicht NTFS ist, funktioniert es nicht. Sie können die Datei immer noch von einer Netzwerkfreigabe auf Ihr lokales System kopieren, aber die atomare Umbenennung funktioniert nicht auf einer Netzwerkfreigabe oder (sofern sie in Zukunft nicht hinzugefügt wird) auf ReFS, was eines Tages zu unserem Standarddateisystem werden kann NTFS hat vor über FAT32 Jahren.
allquixotic
quelle