17Aug

Warum kann ich nicht in Verwendung befindliche Dateien unter Windows ändern, wie ich es unter Linux und OS X kann?


Wenn Sie Linux und OS X verwenden, wird das Betriebssystem Sie nicht davon abhalten, eine Datei zu löschen, die derzeit noch unter Windows verwendet wird. Dies wird Ihnen ausdrücklich untersagt. Was gibt? Warum können Sie In-Use-Dateien auf Unix-basierten Systemen bearbeiten und löschen, aber nicht auf Windows?

Die heutige Frage &Die Antwortsitzung kommt dank SuperUser, einer Unterteilung von Stack Exchange, einer Community-gesteuerten Gruppierung von Q & A-Websites, zu uns.

Die Frage

SuperUser reader the.midget möchte wissen, warum Linux und Windows In-Use-Dateien anders behandeln:

Eines der Dinge, die mich seit dem Start von Linux verwirrt haben, ist die Tatsache, dass Sie damit den Namen ändern könneneine Datei oder lösche sie sogar, während sie gelesen wird. Ein Beispiel ist, wie ich versehentlich versucht habe, ein Video während der Wiedergabe zu löschen. Es ist mir gelungen, und ich war überrascht, als ich erfuhr, dass man fast alles in einer Datei ändern kann, ohne sich darum zu kümmern, ob es gerade verwendet wird oder nicht.

Was passiert hinter den Kulissen und verhindert, dass er mutwillig Dinge in Windows löscht, wie er es unter Linux kann?

Die Antwort-

SuperUser-Mitwirkenden beleuchten die Situation für das. midget. Amazed schreibt:

Immer wenn Sie eine Datei in Windows öffnen oder ausführen, sperrt Windows die Datei an Ort und Stelle( dies ist eine Vereinfachung, aber normalerweise richtig.) Eine Datei, die von einem Prozess gesperrt ist, kann nicht gelöscht werden, bis dieser Prozess sie freigibt. Dies ist der Grund, warum Windows immer dann aktualisiert werden muss, wenn Windows sich selbst aktualisieren muss.

Auf der anderen Seite sperren Unix-ähnliche Betriebssysteme wie Linux und Mac OS X nicht die Datei, sondern die zugrunde liegenden Festplattensektoren. Dies mag eine triviale Unterscheidung sein, aber es bedeutet, dass der Datensatz der Datei im Dateisystem-Inhaltsverzeichnis gelöscht werden kann, ohne ein Programm zu stören, das die Datei bereits geöffnet hat. So können Sie eine Datei löschen, während sie noch ausgeführt wird oder anderweitig verwendet wird, und sie wird weiterhin auf dem Datenträger vorhanden sein, solange ein Prozess ein offenes Handle dafür aufweist, obwohl sein Eintrag in der Dateitabelle nicht mehr vorhanden ist.

David Schwartz erweitert die Idee und hebt hervor, wie die Dinge ideal sein sollten und wie sie in der Praxis funktionieren:

Windows verwendet standardmäßig die automatische, obligatorische Dateisperrung. UNIX standardmäßig auf manuelle, kooperative Dateisperrung. In beiden Fällen können die Standardwerte überschrieben werden, in beiden Fällen jedoch nicht.

Viele alte Windows-Codes verwenden die C / C ++ - API( Funktionen wie fopen) und nicht die native API( Funktionen wie CreateFile).Die C / C ++ - API gibt Ihnen keine Möglichkeit anzugeben, wie die obligatorische Sperrung funktioniert, so dass Sie die Standardwerte erhalten. Der standardmäßige "Freigabe-Modus" verbietet "widersprüchliche" Operationen. Wenn Sie eine Datei zum Schreiben öffnen, wird davon ausgegangen, dass Schreibvorgänge einen Konflikt verursachen, auch wenn Sie niemals tatsächlich in die Datei schreiben. Dito für Umbenennungen.

Und hier wird es noch schlimmer. Anders als beim Lesen oder Schreiben, bietet die C / C ++ - API keine Möglichkeit anzugeben, was Sie mit der Datei machen wollen. Daher muss die API davon ausgehen, dass Sie eine legale Operation durchführen werden. Da die Sperrung obligatorisch ist, wird ein Öffnen, das eine konfliktverursachende Operation zulässt, abgelehnt, selbst wenn der Code die konfliktverursachende Operation niemals ausführen wollte, sondern die Datei nur für einen anderen Zweck öffnete.

Wenn Code die C / C ++ - API verwendet oder die native API verwendet, ohne sich speziell mit diesen Problemen zu befassen, werden sie die maximale Anzahl möglicher Operationen für jede geöffnete Datei verhindern und können nur bei jeder möglichen Operation eine Datei öffnenSie könnten daran arbeiten, sobald das Öffnen nicht möglich ist.

Meiner Meinung nach würde die Windows-Methode viel besser funktionieren als die UNIX-Methode, wenn jedes Programm seine Freigabemodi auswählt und die Modi weise und fehlerfrei behandelt. Die UNIX-Methode funktioniert jedoch besser, wenn der Code sich keine Gedanken über diese Probleme macht. Leider ist die grundlegende C / C ++ - API nicht gut auf die Windows-Datei-API abgebildet, so dass Freigabemodi und Konflikte gut geöffnet werden. Also ist das Nettoergebnis ein bisschen unordentlich.

Da haben Sie es: zwei unterschiedliche Ansätze zur Dateiverwaltung ergeben zwei unterschiedliche Ergebnisse.

Haben Sie etwas zur Erklärung hinzuzufügen? Ton in den Kommentaren ab. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange Benutzern lesen? Sehen Sie sich den vollständigen Diskussionsfaden hier an.