Warum kopiert robocopy immer noch eine geöffnete Datei, die vom txt-Editor in Windows geöffnet wird?

879
cuda

Aus Wikipedia wird berichtet, dass Robocopy das Kopieren von Dateien im geöffneten Status überspringt.

Wenn Robocopy getestet wird, kopiert es dennoch die geöffnete Datei mit dem einfachsten Texteditor in Windows. Warum?

4
Mögliches Duplikat von [Warum warnt Windows nicht vor Dateien, die für bestimmte Programme verwendet werden?] (Https://superuser.com/questions/853420/why-is-windows-not-warning-about-file-in-use-for bestimmte Programme) phuclv vor 5 Jahren 1

3 Antworten auf die Frage

5
grawity

Wie @fejyesynb richtig bemerkt, behält Notepad keinen aktiven Dateihandle bei. Er öffnet die Datei, liest (oder schreibt) die Daten schnell und schließt die Datei wieder. Die Daten werden auf dem Bildschirm angezeigt, aber die Datei wird tatsächlich die ganze Zeit geschlossen.

Zweitens hat Windows von MS-DOS das Konzept der "Freigabemodi" als eine einfache Form der Dateisperrung geerbt. Beim Öffnen einer Datei können Sie auswählen, ob Sie sie zum Lesen / Schreiben, nur zum Lesen oder gar nicht freigeben möchten.

Wenn Ihr Programm (Robocopy) beispielsweise die Datei zum Lesen öffnen möchte (FileAccess.Read), ist es nur erfolgreich, wenn alle vorhandenen Dateihandles den Freigabemodus "Lesen" zulassen (oder wenn keine offenen Dateihandles vorhanden sind.) alles). Wenn die Datei jedoch mit "share none" geöffnet wurde, wird "File in use" angezeigt, wenn Sie versuchen, sie zu einem beliebigen Zweck zu öffnen .

Sie können dies in PowerShell durchführen, indem Sie die untergeordnete .NET- Funktion System.IO.File.Open () aufrufen :

$fh = [System.IO.File]::Open($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::None) 

Der vierte Parameter kann ein beliebiger System.IO.FileShare-Enumerationswert sein, beispielsweise:

  • [System.IO.FileShare]::None - nichts teilen
  • [System.IO.FileShare]::Read - Share lesen (Block schreiben / löschen)
  • [System.IO.FileShare]::ReadWrite - Lesen / Schreiben teilen (Block löschen)

Wenn du fertig bist:

$fh.Close() 
4
fejyesynb

Weil Sie an eine andere Bedeutung von "offen" denken.

Notepad (und alle anderen Texteditoren, die ich kenne) öffnet eine Datei zum Lesen, die Sie dann auf Ihrem Bildschirm sehen. Dann schließt es die Datei, während Sie den Inhalt (jetzt im RAM) noch sehen können.

Wenn Sie zum Beispiel haben fd = open("file.txt", FLAGS);und es (noch) nicht geschlossen ist close(fd), wird es nicht mit Robocopy kopiert.

Wie kann ich also den Fall simulieren, um die Datei auf einfache Weise zu öffnen? Ich möchte die Robocopy-Eigenschaften anzeigen, die das Kopieren von geöffneten Dateieigenschaften vermeiden. Kann aber keinen einfachen Weg finden, um es immer wieder zu öffnen cuda vor 5 Jahren 0
Der einfachste Weg, den ich mir vorstellen kann (unter Windows), besteht darin, ein einfaches C-Programm zu erstellen, das eine Datei öffnet, etwa 60 Sekunden lang schläft und danach schließt. Sie haben dann 60 Sekunden, um Robocopy zu testen. fejyesynb vor 5 Jahren 0
@cuda Für eine genauere Antwort öffnen Sie eine neue Frage (1 Frage pro Post zu SE). fejyesynb vor 5 Jahren 0
Abgesehen von der Erstellung eines Programms und eines Platzes in diesem Remote-Sitzungscomputer, ist es mit Windows-Skripten einfacher? habe keine ide von C programm / JAVA / C # cuda vor 5 Jahren 0
Ich denke nicht, dass Skripte niedrig genug sind, um Aufrufe des Systems "open" und "close" durchzuführen fejyesynb vor 5 Jahren 0
Der Stackexchange setzt die Regeln durch, um in 40 Minuten später eine weitere Frage zu erstellen. Gibt es eine andere Möglichkeit, die Datei offen zu halten, ohne das einfachste C-Programm zu schreiben, müssen Sie nicht die IDE-Tools oder die Berechtigung zur Installation haben cuda vor 5 Jahren 0
Ich schätze mal, dass so etwas https://social.technet.microsoft.com/Forums/en-US/a6231646-57df-43ca-86db-dc04d93c32de/opening-text-file-with-vbscript?forum=ITCG cuda vor 5 Jahren 0
eröffnete eine weitere Frage hier https://superuser.com/questions/1360787/wie-für-simply-keep-a-epile-in-open-status-ohne-help-von-programm-in-c-language-e aber scheint nicht mit den Skripten zu arbeiten ... die Datei wird immer noch kopiert ... robocoy ignoriert das Kopieren nicht cuda vor 5 Jahren 0
@fejyesynb: Praktisch alles * über dem Cmd-Level * kann damit umgehen. PowerShell verfügt beispielsweise über vollständigen .NET-Laufzeitzugriff. grawity vor 5 Jahren 0
@grawity Es würde mich sehr freuen, wenn Sie ein paar Einblicke geben könnten, wie man das Dateihandle öffnen und halten kann, ohne die Datei zu schließen. Dann führe ich die Robocopy aus, um zu sehen, ob das Kopieren der geöffneten Datei wirklich funktioniert. cuda vor 5 Jahren 0
1
phuclv

Abhängig davon, wie die Datei geöffnet wird

Viele Anwendungen laden die gesamte Datei in den Speicher und schließen sie. Daher wird die Datei nicht verwendet. Dies kann natürlich nicht für große Dateien verwendet werden. Daher verfügen Editoren für große Textdateien über verschiedene Techniken, um effizient zu arbeiten, beispielsweise das gleichzeitige Laden eines Teils der Datei in den Speicher

Viele andere lassen das Dateihandle geöffnet, aber sie sperren die Datei nicht

Notizblock OTOH ordnet die Datei dem Arbeitsspeicher zu, wodurch eine Datei entsteht, die nicht wie geöffnet aussieht. Das bedeutet, dass das, was fejyesynb gesagt hat, nicht korrekt ist, weil es die Datei nicht in den RAM lädt

Für weitere Informationen können Sie lesen