17Aug

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


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, jolle estetään nimenomainen käyttö.Mikä antaa? Miksi voit muokata ja poistaa käytettyjä tiedostoja Unix-järjestelmissä, mutta ei Windowsia?

Tämän päivän kysymys &Vastausistunto tulee meille kohteliaasti SuperUser-osastoon Stack Exchange, yhteisöllinen ryhmittely Q & A verkkosivuilla.

Kysymys

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

Yksi niistä asioista, jotka ovat ymmärtäneet minua siitä lähtien, kun aloitin Linuxin käytön, on se, että voit muuttaatiedosto tai jopa poistaa sen, kun sitä luetaan. Esimerkkinä on se, miten yritin vahingossa yrittää poistaa videon toiston aikana. Sain onnistuneen ja yllätyin, kun oppin, että voit vaihtaa lähes mitä tahansa tiedostosta huolimatta, jos sitä käytetään tällä hetkellä tai ei.

Joten mitä tapahtuu kulissien takana ja estää häneltä haluttomalta poistamasta asioita Windowsissa kuten hän voi Linuxissa?

Vastaus

SuperUser -tuottajat 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 levytekijät. Tämä voi tuntua vähäpätöiseltä eriytyneeltä, mutta se tarkoittaa, että tiedostojärjestelmän tietue sisällytetiedostossa 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 syöttäminen tiedostotaulussa on poissa.

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

Windows on automaattisesti automaattinen, pakollinen tiedostojen lukitus. UNIX-oletusarvo manuaaliseen, yhteistyöhön liittyvään tiedostojen lukitsemiseen. Kummassakin tapauksessa oletusasetuksia voidaan ohittaa, mutta molemmissa tapauksissa ne eivät tavallisesti ole.

Useat vanhat Windows-koodit käyttävät C / C ++ API: tä( kuten fopen) kuin natiivi API( kuten CreateFile).C / C ++ -sovellusliittymällä ei ole mitään keinoa määrittää, miten pakollinen lukitus toimii, joten saat oletusarvot. Oletuksena on, että "jakamoodi" estää ristiriitaisia ​​toimintoja. Jos avaat tiedoston kirjoittamista varten, kirjoitusten oletetaan olevan ristiriidassa, vaikka et koskaan todella kirjoittaa tiedostoon. Ditto renames.

Ja tässä se pahenee. C / C ++ -sovellusliittymällä ei ole mitään avaamista lukemista tai kirjoittamista varten, koska siinä ei ole mitään mahdollisuutta määrittää, mitä aiot tehdä tiedostolla. API: n on siis oletettava, että olet tekemässä mitään laillista toimintaa. Koska lukitseminen on pakollista, avoin, joka sallii ristiriitaisen operaation, evätään, vaikka koodi ei ole koskaan aiottu suorittamaan ristiriitaista operaatiota, vaan avasi tiedoston vain toista tarkoitusta varten.

Joten jos koodi käyttää C / C ++ API: ta tai käyttää natiivia API ilman erityistä ajattelua näistä asioista, ne lopettaa mahdollisimman suuren joukon mahdollisia toimintoja jokaista tiedostoa, jotka ne avaavat, eivätkä pysty avaamaan tiedostoa, elleivät kaikki mahdolliset toimenpiteethe voisivat toimia sen jälkeen, kun avattu on ristiriidassa.

Mielestäni Windows-menetelmä toimisi paljon paremmin kuin UNIX-menetelmä, jos jokainen ohjelma valitsi jakamoodit ja avoimet toimintatavat järkevästi ja vakaasti käsiteltäessä vikatapauksia. UNIX-menetelmä toimii kuitenkin paremmin, jos koodi ei vaivaudu pohtimaan näitä asioita. Valitettavasti perus C / C ++ API ei kartoittaa hyvin Windows-tiedosto-sovellusliittymää tavalla, joka käsittelee jakamoodit ja ristiriitaiset avautuvat hyvin. Niinpä nettotulos on vähän sotkuinen.

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

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