Miksi en voi vaihtaa käytössä olevia tiedostoja Windowsissa kuin minä Linuxissa ja OS X: ssä?

Sisällysluettelo:

Miksi en voi vaihtaa käytössä olevia tiedostoja Windowsissa kuin minä Linuxissa ja OS X: ssä?
Miksi en voi vaihtaa käytössä olevia tiedostoja Windowsissa kuin minä Linuxissa ja OS X: ssä?
Anonim
 Kun käytät Linuxia ja OS X: tä, käyttöjärjestelmä ei estä sinua poistamasta tällä hetkellä käytössä olevaa tiedostoa Windowsissa, sinun on nimenomaisesti kiellettävä tekemästä niin. Mikä antaa? Miksi voit muokata ja poistaa käytettyjä tiedostoja Unix-järjestelmissä, mutta ei Windowsia?
Kun käytät Linuxia ja OS X: tä, käyttöjärjestelmä ei estä sinua poistamasta tällä hetkellä käytössä olevaa tiedostoa Windowsissa, sinun on nimenomaisesti kiellettävä tekemästä niin. Mikä antaa? Miksi voit muokata ja poistaa käytettyjä tiedostoja Unix-järjestelmissä, mutta ei Windowsia?

Tämänpäiväinen kysymys- ja vastaus-istunto tulee meille Hyvinkään, Super-käyttäjän, Stack Exchange-jaosta, joka on yhteisöllinen Q & A-sivustojen ryhmittely.

Kysymys

SuperUser-lukija the.midget haluaa tietää, miksi Linux ja Windows käsittelevät käytössä olevia tiedostoja eri tavoin:

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.

Joten mitä tapahtuu kulissien takana ja estää häneltä, että hän pyyhkäisee asioita Windowsissa, kuten hän voi Linuxissa?

Vastaus

SuperUser-avustajat antavat valolle tilannetta. Hämmästynyt kirjoittaa:

Aina kun avaat tai suoritat tiedoston Windowsissa, Windows lukitsee tiedoston paikoillaan (tämä on yksinkertaistaminen, mutta yleensä totta.) Tiedostoa, joka on lukittu prosessilla, ei voida poistaa, ennen kuin prosessi vapauttaa sen. Siksi aina, kun Windowsin on päivitettävä itse, tarvitset uudelleenkäynnistyksen, jotta se tulee voimaan.

Toisaalta Unixin kaltaiset käyttöjärjestelmät, kuten Linux ja Mac OS X, eivät lukitse tiedostoa, vaan taustalla olevat levyalat. Tämä voi tuntua vähäiseltä eriytyneeltä, mutta se tarkoittaa, että tiedoston tiedostojärjestelmän sisältämä tietue voidaan poistaa häiritsemättä mitä tahansa ohjelmaa, jolla tiedosto on jo auki. Joten voit poistaa tiedoston, kun se on vielä suorittamassa tai muulla tavoin käytössä ja se säilyy levylle niin kauan kuin jotkut prosessit käsittelevät avoimen kädensijan, vaikka sen tiedostopöydässä oleva tieto on poissa.

David Schwartz laajentaa ajatusta ja korostaa, miten asioiden pitäisi olla ihanteellisia ja miten ne ovat käytännössä:

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.

Siellä sinulla on: kaksi erilaista lähestymistapaa tiedostojen käsittelyyn tuottaa kaksi erilaista tulosta.

Onko jokin asia lisättävä selitykseen? Kuulkaa kommentit. Haluatko lukea lisää vastauksia muilta tech-tajuilta Stack Exchange-käyttäjiltä? Katso koko keskusteluketju täältä.

Suositeltava: