Warum kann ich den Namen einer Datei, die unter Windows gelesen wird, nicht wie unter Linux / Mac ändern?

23

Eines der Dinge, die mich seit dem Start von Linux verwundert haben, ist die Tatsache, dass Sie den Namen einer Datei ändern oder sogar löschen können, während sie gelesen wird. Ein Beispiel ist, wie ich versehentlich versucht habe, ein Video zu löschen, während es abgespielt wurde. Ich hatte Erfolg und war überrascht, als ich erfuhr, dass Sie fast alles in einer Datei ändern können, ohne sich darum zu kümmern, ob sie gerade verwendet wird oder nicht.

the_midget_17
quelle
2
Das Umbenennen einer gesperrten Datei ist unter Windows kein Problem. Normalerweise gibt es nur wenige Programme, die eine Datei mit aktivierter Option FILE_SHARE_DELETE öffnen.
Hans Passant
Sie haben es tatsächlich nicht gelöscht, sondern nur aus dem Verzeichnis entfernt, in dem es sich befand. Die Datei existiert noch, sie hat möglicherweise keinen Namen im Dateisystem. (Obwohl es im /procDateisystem über das Programm, in dem es geöffnet ist, noch einen Namen hat.) Eine Datei kann nur dann wirklich gelöscht werden, wenn keine Referenzen mehr vorhanden sind, und dies geschieht automatisch.
David Schwartz

Antworten:

36

Wann immer Sie eine Datei in Windows öffnen oder ausführen, sperrt Windows die Datei (dies ist eine Vereinfachung, aber normalerweise wahr). Eine Datei, die durch einen Prozess gesperrt ist, kann erst gelöscht werden, wenn dieser Prozess sie freigibt. Aus diesem Grund müssen Sie jedes Mal, wenn Windows sich selbst aktualisieren muss, einen Neustart durchführen, damit die Aktualisierung wirksam wird.

Auf der anderen Seite sperren Unix-ähnliche Betriebssysteme wie Linux und Mac OS X nicht die Datei, sondern die zugrunde liegenden Festplattensektoren. Dies mag trivial erscheinen, bedeutet aber, dass der Datensatz der Datei im Inhaltsverzeichnis des Dateisystems gelöscht werden kann, ohne ein Programm zu stören, in dem die Datei bereits geöffnet ist. So können Sie eine Datei löschen, während sie noch ausgeführt oder anderweitig verwendet wird, und sie bleibt auf der Festplatte bestehen, solange ein Prozess ein offenes Handle dafür hat, obwohl der Eintrag in der Dateitabelle weg ist.

Andrew Lambert
quelle
2
Danke für diese Antwort. Das erklärt mir den Unterschied viel mehr. Außerdem wird erläutert, warum das Laden großer Dateien / Videos nicht immens viel RAM beansprucht. Andernfalls könnte das Abspielen eines großen Videos Ihr gesamtes System zum Stillstand bringen.
Jerry Saravia
4
Wenn Sie eine verwendete Datei gelöscht haben und sie unter Linux wiederherstellen möchten, finden Sie den in dieser Frage beschriebenen Eintrag der Datei in / proc .
Ken Bloom
2
Dies ist eher eine Verallgemeinerung - nicht alle Windows-Aktualisierungen in diesen Tagen (unter Windows 7) erfordern einen Neustart, und unter Linux habe ich viel getan.
Alan B
10

Windows verwendet standardmäßig die automatische, obligatorische Dateisperrung. UNIX verwendet standardmäßig die manuelle kooperative Dateisperrung. In beiden Fällen können die Standardeinstellungen außer Kraft gesetzt werden, in beiden Fällen jedoch normalerweise nicht.

Ein Großteil des alten Windows-Codes verwendet die C / C ++ - API (Funktionen wie fopen) und nicht die native API (Funktionen wie CreateFile). Mit der C / C ++ - API können Sie nicht angeben, wie das obligatorische Sperren funktionieren soll, sodass Sie die Standardeinstellungen erhalten. Der standardmäßige "Freigabemodus" verhindert in der Regel "widersprüchliche" Vorgänge. Wenn Sie eine Datei zum Schreiben öffnen, wird davon ausgegangen, dass beim Schreiben Konflikte auftreten, auch wenn Sie nie tatsächlich in die Datei schreiben. Das Gleiche gilt für Umbenennungen.

Und hier wird es noch schlimmer. Abgesehen vom Öffnen zum Lesen oder Schreiben bietet die C / C ++ - API keine Möglichkeit, anzugeben, was Sie mit der Datei tun möchten. Die API muss also davon ausgehen, dass Sie einen legalen Vorgang ausführen. Da das Sperren obligatorisch ist open, wird ein Vorgang , der einen Konflikt zulässt , abgelehnt, selbst wenn der Code den Konflikt niemals ausführen wollte, sondern die Datei nur für einen anderen Zweck öffnet.

Wenn also Code die C / C ++ - API verwendet oder die native API verwendet, ohne sich mit diesen Problemen zu befassen, verhindern sie die maximale Anzahl möglicher Vorgänge für jede Datei, die sie öffnen, und können eine Datei nur öffnen, wenn alle möglichen Vorgänge ausgeführt werden könnte darauf ausführen, sobald geöffnet ist uneingeschränkt.

Meiner Meinung nach würde die Windows-Methode viel besser funktionieren als die UNIX-Methode, wenn jedes Programm seine Freigabemodi und Öffnungsmodi wählte und Fehlerfälle vernünftig und vernünftig handhabte. Die UNIX-Methode funktioniert jedoch besser, wenn sich der Code nicht mit diesen Problemen befasst. Leider ist die grundlegende C / C ++ - API der Windows-Datei-API nicht so gut zugeordnet, dass sie mit Freigabemodi und Konflikten beim Öffnen gut zurechtkommt. Das Nettoergebnis ist also etwas chaotisch.

David Schwartz
quelle
0

Dies ist eine sehr interessante Frage, die mich zu einer brauchbaren Antwort veranlasst hat. Ich hoffe, andere können hier Unterstützung leisten.

Ich benutze sowohl Windows als auch Linux und habe dies auch bemerkt. Ich bin auch ein Benutzer von vim. Vim liest eine Textdatei in einen 'Puffer' oder den RAM und berührt die eigentliche Datei erst dann, wenn Sie sie speichern. Linux führt diese Aktion möglicherweise generell für alle Dateien aus.

Nehmen Sie Ihr Video zum Beispiel, es liest das gesamte Video, wenn möglich, in den RAM, und Sie haben dann eine Kopie des Videos, die leicht zugänglich, suchbar und überspringbar ist. Wenn die Datei zu groß ist, können Probleme auftreten, da Linux möglicherweise nicht das gesamte Video liest, möglicherweise nur einen großen Teil. Wenn Ihr Player das Ende des gepufferten Videos erreicht, versucht er, die Datei erneut zu lesen. Wenn du das Video gelöscht hast, ist das schade für dich.

Windows ist in einigen Fällen ein viel 'sichereres' Betriebssystem, da Sie dies nicht zulassen. Es puffert die Dateien möglicherweise auf die gleiche Weise wie Linux, fügt jedoch auch eine Dateisperrung hinzu, um zu verhindern, dass Sie oder andere Programme Dateien ändern, an denen Sie arbeiten oder die Sie anzeigen. Dies hilft dabei, die Datei intakt zu halten und zu verhindern, dass Sie oder andere Programme die Änderungen des anderen überschreiben.

Jerry Saravia
quelle
Sie können es nicht wirklich löschen . Bewegen Sie es einfach herum und benennen Sie es um.
Daniel Beck
2
Sie können es "rm". Das ist nah genug, um es zu löschen.
Chris Moore