Warum kann ich In-Use-Dateien unter Windows nicht wie unter Linux und OS X ändern?

Inhaltsverzeichnis:

Video: Warum kann ich In-Use-Dateien unter Windows nicht wie unter Linux und OS X ändern?

Video: Warum kann ich In-Use-Dateien unter Windows nicht wie unter Linux und OS X ändern?
Video: How to Run Android Apps on PC without Emulator? Use Android App on PC | Install Android Apps on PC 2024, März
Warum kann ich In-Use-Dateien unter Windows nicht wie unter Linux und OS X ändern?
Warum kann ich In-Use-Dateien unter Windows nicht wie unter Linux und OS X ändern?
Anonim
 Wenn Sie Linux und OS X verwenden, wird das Betriebssystem Sie nicht daran hindern, eine Datei zu löschen, die gerade verwendet wird, aber unter Windows ist dies ausdrücklich untersagt. Was gibt? Warum können Sie verwendete Dateien auf Unix-Systemen, nicht aber Windows, bearbeiten und löschen?
Wenn Sie Linux und OS X verwenden, wird das Betriebssystem Sie nicht daran hindern, eine Datei zu löschen, die gerade verwendet wird, aber unter Windows ist dies ausdrücklich untersagt. Was gibt? Warum können Sie verwendete Dateien auf Unix-Systemen, nicht aber Windows, bearbeiten und löschen?

Die heutige Question & Answer-Sitzung wird von SuperUser bereitgestellt, einer Unterteilung von Stack Exchange, einer Community-basierten Gruppierung von Q & A-Websites.

Die Frage

SuperUser-Leser the.midget möchte wissen, warum Linux und Windows verwendete Dateien unterschiedlich behandeln:

One of the things that has puzzled me ever since I started using Linux is the fact that it allows you to change the name of a file or even delete it while it is being read. An example is how I accidentally tried to delete a video while it was playing. I succeeded, and was surprised as I learnt that you can change just about anything in a file without caring if it’s being used at the moment or not.

Was passiert also hinter den Kulissen und hindert ihn daran, mutwillig Dinge in Windows zu löschen, wie er es in Linux kann?

Die Antwort

SuperUser-Mitwirkende haben die Situation für the.midget beleuchtet. Erstaunt schreibt:

Immer, wenn Sie eine Datei in Windows öffnen oder ausführen, sperrt Windows die Datei (dies ist eine Vereinfachung, die jedoch normalerweise zutrifft). Eine Datei, die von einem Prozess gesperrt ist, kann erst gelöscht werden, wenn dieser Prozess sie freigibt. Aus diesem Grund müssen Sie immer einen Neustart durchführen, wenn Windows sich selbst aktualisieren muss.

Auf der anderen Seite sperren Unix-ähnliche Betriebssysteme wie Linux und Mac OS X nicht die Datei, sondern eher die zugrunde liegenden Festplattensektoren. Dies scheint eine triviale Unterscheidung zu sein, bedeutet jedoch, dass der Datensatz der Datei im Inhaltsverzeichnis des Dateisystems gelöscht werden kann, ohne dass ein Programm, das die Datei bereits geöffnet hat, gestört wird. Sie können also eine Datei löschen, während sie noch ausgeführt wird oder anderweitig verwendet wird, und sie bleibt auf der Festplatte vorhanden, solange ein Prozess ein offenes Handle für sie hat, obwohl der Eintrag in der Dateitabelle nicht mehr vorhanden ist.

David Schwartz erläutert die Idee und zeigt auf, wie die Dinge ideal sein sollten und wie sie in der Praxis sind:

Windows defaults to automatic, mandatory file locking. UNIXes default to manual, cooperative file locking. In both cases, the defaults can be overriden, but in both cases they usually aren’t.

A lot of old Windows code uses the C/C++ API (functions like fopen) rather than the native API (functions like CreateFile). The C/C++ API gives you no way to specify how mandatory locking will work, so you get the defaults. The default “share mode” tends to prohibit “conflicting” operations. If you open a file for writing, writes are assumed to conflict, even if you never actually write to the file. Ditto for renames.

And, here’s where it gets worse. Other than opening for read or write, the C/C++ API provides no way to specify what you intend to do with the file. So the API has to assume you are going to perform any legal operation. Since the locking is mandatory, an open that allows a conflicting operation will be refused, even if the code never intended to perform the conflicting operation but was just opening the file for another purpose.

So if code uses the C/C++ API, or uses the native API without specifically thinking about these issues, they will wind up preventing the maximum set of possible operations for every file they open and being unable to open a file unless every possible operation they could perform on it once opened is unconflicted.

In my opinion, the Windows method would work much better than the UNIX method if every program chose its share modes and open modes wisely and sanely handled failure cases. The UNIX method, however, works better if code doesn’t bother to think about these issues. Unfortunately, the basic C/C++ API doesn’t map well onto the Windows file API in a way that handles share modes and conflicting opens well. So the net result is a bit messy.

Da haben Sie es: Zwei unterschiedliche Ansätze für die Dateibehandlung führen zu zwei unterschiedlichen Ergebnissen.

Haben Sie etwas zur Erklärung hinzuzufügen? Ton aus in den Kommentaren. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange-Benutzern lesen? Hier geht es zum vollständigen Diskussionsthread.

Empfohlen: