Waarom kan ik in gebruik zijnde bestanden niet wijzigen op Windows zoals ik kan op Linux en OS X?

waarom-kan-en-8217;t-i-wijzig-in-gebruik-bestanden-op-windows-zoals-i-can-op-linux-en-os-x foto 1
Wanneer u Linux en OS X gebruikt, zal het besturingssysteem u er niet van weerhouden een bestand te verwijderen dat momenteel in gebruik is op Windows, u wordt hier uitdrukkelijk van uitgesloten. Wat geeft? Waarom kunt u in gebruik zijnde bestanden bewerken en verwijderen op Unix-afgeleide systemen, maar niet op Windows?

De vraag- en antwoordsessie van vandaag komt tot ons met dank aan SuperUser - een onderverdeling van Stack Exchange, een community-gedreven groepering van Q&A-websites.

De vraag

SuperUser-lezer the.midget wil weten waarom Linux en Windows in gebruik zijnde bestanden anders behandelen:



Een van de dingen die me in verwarring hebben gebracht sinds ik Linux begon te gebruiken, is het feit dat je de naam van een bestand kunt wijzigen of zelfs kunt verwijderen terwijl het wordt gelezen. Een voorbeeld is hoe ik per ongeluk probeerde een video te verwijderen terwijl deze aan het spelen was. Het is me gelukt en ik was verrast toen ik hoorde dat je zo ongeveer alles in een bestand kunt wijzigen zonder dat je je zorgen hoeft te maken of het op dit moment wordt gebruikt of niet.

Dus wat gebeurt er achter de schermen en voorkomt dat hij moedwillig dingen in Windows verwijdert zoals hij kan in Linux?

Het antwoord

SuperUser-bijdragers werpen enig licht op de situatie voor the.midget. Verbaasd schrijft:

Telkens wanneer u een bestand in Windows opent of uitvoert, vergrendelt Windows het bestand op zijn plaats (dit is een vereenvoudiging, maar meestal waar.) Een bestand dat is vergrendeld door een proces kan niet worden verwijderd totdat dat proces het vrijgeeft. Dit is de reden waarom wanneer Windows zichzelf moet updaten, u opnieuw moet opstarten om het van kracht te laten worden.

Aan de andere kant vergrendelen Unix-achtige besturingssystemen zoals Linux en Mac OS X niet het bestand, maar eerder de onderliggende schijfsectoren. Dit lijkt misschien een triviale differentiatie, maar het betekent dat de record van het bestand in de inhoudsopgave van het bestandssysteem kan worden verwijderd zonder enig programma te storen dat het bestand al heeft geopend. U kunt dus een bestand verwijderen terwijl het nog wordt uitgevoerd of anderszins in gebruik is en het zal op de schijf blijven bestaan ​​zolang een proces er een open handvat voor heeft, ook al is de invoer in de bestandstabel verdwenen.

David Schwartz borduurt voort op het idee en benadrukt hoe de dingen ideaal zouden moeten zijn en hoe ze in de praktijk zijn:

Windows is standaard ingesteld op automatische, verplichte bestandsvergrendeling. UNIX's zijn standaard ingesteld op handmatige, coöperatieve bestandsvergrendeling. In beide gevallen kunnen de standaardinstellingen worden overschreven, maar in beide gevallen is dit meestal niet het geval.

Veel oude Windows-code gebruikt de C/C++ API (functies zoals fopen) in plaats van de native API (functies zoals CreateFile). De C/C++ API geeft je geen manier om aan te geven hoe verplichte vergrendeling zal werken, dus je krijgt de standaardinstellingen. De standaard deelmodus heeft de neiging om conflicterende bewerkingen te verbieden. Als u een bestand opent om te schrijven, wordt aangenomen dat het schrijven conflicteert, zelfs als u nooit echt naar het bestand schrijft. Idem voor hernoemen.

En hier wordt het erger. Behalve het openen voor lezen of schrijven, biedt de C/C++ API geen manier om aan te geven wat u van plan bent met het bestand te doen. De API moet er dus vanuit gaan dat u een juridische handeling gaat uitvoeren. Aangezien de vergrendeling verplicht is, wordt een open die een conflicterende handeling toestaat geweigerd, zelfs als de code nooit bedoeld was om de conflicterende handeling uit te voeren, maar het bestand gewoon voor een ander doel had geopend.

Dus als code de C/C++ API gebruikt, of de native API gebruikt zonder specifiek over deze problemen na te denken, zullen ze eindigen met het voorkomen van de maximale reeks mogelijke bewerkingen voor elk bestand dat ze openen en niet in staat zijn om een ​​bestand te openen tenzij elke mogelijke bewerking die ze zou kunnen uitvoeren als het eenmaal is geopend, is niet strijdig.

Naar mijn mening zou de Windows-methode veel beter werken dan de UNIX-methode als elk programma zijn deelmodi en open modi zou kiezen, verstandig en verstandig om te gaan met mislukkingen. De UNIX-methode werkt echter beter als code niet de moeite neemt om over deze problemen na te denken. Helaas past de basis-C/C++-API niet goed op de Windows-bestands-API op een manier die deelmodi en conflicterende openingen goed afhandelt. Dus het netto resultaat is een beetje rommelig.

Daar heb je het: twee verschillende benaderingen van bestandsverwerking leveren twee verschillende resultaten op.