Miksi en voi vaihtaa käytössä olevia tiedostoja Windowsissa kuten minä voin Linuxissa ja OS X ssä?
Kun käytät Linuxia ja OS X -käyttöjärjestelmää, käyttöjärjestelmä ei estä sinua poistamasta vielä käytössä olevaa tiedostoa Windowsissa, sillä sen käyttö on kielletty. Mikä antaa? Miksi voit muokata ja poistaa käytössä olevia tiedostoja Unixista peräisin olevissa järjestelmissä, mutta ei Windowsissa?
Nykypäivän Kysymys- ja vastaus -istunto tulee meille suotuisasti SuperUserin - Stack Exchange -alueen, yhteisöpohjaisen Q & A-sivustojen ryhmittymän - kautta..
Kysymys
SuperUser-lukija the.midget haluaa tietää, miksi Linux ja Windows käsittelevät käytössä olevia tiedostoja eri tavalla:
Yksi asioista, jotka ovat hämmentäneet minua siitä lähtien, kun aloin käyttää Linuxia, on se, että sen avulla voit muuttaa tiedoston nimeä tai jopa poistaa sen, kun sitä luetaan. Esimerkki siitä, miten yritin vahingossa poistaa videon toiston aikana. Onnistuin, ja olin hämmästynyt siitä, että sain tietää, että voit muuttaa vain jotain tiedostoa ilman huolta, jos sitä käytetään tällä hetkellä tai ei.
Joten mitä tapahtuu kulissien takana ja estää häntä poistamasta tahattomasti asioita Windowsissa kuten hän voi Linuxissa?
Vastaus
SuperUser-avustajat kertoivat valon tilanteesta. Hämmästynyt kirjoittaa:
Aina kun avaat tai suoritat tiedoston Windowsissa, Windows lukitsee tiedoston paikoilleen (tämä on yksinkertaistaminen, mutta yleensä totta.) Prosessin lukittua tiedostoa ei voi poistaa ennen kuin prosessi vapauttaa sen. Siksi aina, kun Windows päivittää itsensä, 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 olevia levyn sektoreita. Tämä saattaa tuntua triviaaliselta erottelulta, mutta se tarkoittaa, että tiedostotiedoston tiedostojärjestelmäluettelossa oleva tiedosto voidaan poistaa ilman, että se häiritsee ohjelmia, joissa tiedosto on jo auki. Voit siis poistaa tiedoston, kun se on vielä käynnissä tai muuten käytössä, ja se on edelleen levyllä niin kauan kuin jollakin prosessilla on avoin kahva sille, vaikka sen merkintä tiedostotaulukkoon on mennyt.
David Schwartz laajentaa ajatusta ja korostaa, miten asioiden pitäisi olla ihanteellisia ja miten ne ovat käytännössä:
Windows on oletusarvoisesti automaattinen, pakollinen tiedostojen lukitus. UNIXes on oletusarvoisesti manuaalinen, yhteistoiminnallinen tiedostojen lukitus. Molemmissa tapauksissa oletusarvot voivat olla ylittyneet, mutta molemmissa tapauksissa ne eivät yleensä ole.
Paljon vanhoja Windows-koodeja käytetään pikemminkin C / C + + -liittymää (funktiot kuten fopen) kuin natiivi API (toimii kuten CreateFile). C / C + + -sovellusliittymä ei anna mitään tapaa määrittää, miten pakollinen lukitus toimii, niin saat oletusarvot. Oletus ”jakotila” pyrkii kieltämään ristiriitaiset toiminnot. Jos avaat tiedoston kirjoitettavaksi, kirjoitetaan oletettavasti ristiriitaiseksi, vaikka et koskaan kirjoita tiedostoon. Nimeä uudelleen.
Ja tässä se pahenee. Lukuun ottamatta lukemista tai kirjoittamista, C / C ++ -sovellusliittymä ei anna mitään keinoa määrittää, mitä aiot tehdä tiedoston kanssa. Niinpä API: n on oletettava, että aiotte suorittaa mitä tahansa oikeudellista toimintaa. Koska lukitus on pakollinen, avataan, joka sallii ristiriitaisen toiminnon, vaikka koodi ei ole koskaan tarkoitettu suorittamaan ristiriitaa toimintaa, mutta avasi tiedoston vain toiseen tarkoitukseen.
Joten jos koodi käyttää C / C ++ API: ta tai käyttää natiivia API: ta miettimättä tarkasti näitä ongelmia, ne lopettavat estääkseen mahdollisten mahdollisten toimintojen enimmäisjoukon jokaiselle avattavalle tiedostolle ja eivät pysty avaamaan tiedostoa, elleivät kaikki mahdolliset toiminnot voisi suorittaa sitä, kun se on avattu.
Mielestäni Windows-menetelmä toimisi paljon paremmin kuin UNIX-menetelmä, jos jokainen ohjelma valitsi osake-tilansa ja avoimet toimintatavat viisaasti ja sanelyä käsittelevät vikatapaukset. UNIX-menetelmä toimii kuitenkin paremmin, jos koodi ei vaivaudu ajattelemaan näitä asioita. Valitettavasti C / C ++ -sovelluksen perusliittymä ei näytä hyvin Windows-tiedostojen API: ta tavalla, joka käsittelee jakomuotoja ja ristiriidassa avautuu hyvin. Niinpä nettotulos on hieman sotkuinen.
Siellä on se: kaksi erilaista lähestymistapaa tiedostojen käsittelyyn tuottaa kaksi erilaista tulosta.
Onko jotain lisättävää selitykseen? Ääni pois kommenteista. Haluatko lukea lisää vastauksia muilta tech-savvy Stack Exchange -käyttäjiltä? Tutustu koko keskusteluketjuun täällä.