Domača » kako » Zakaj ne morem spremeniti v uporabi datotek na Windows, kot sem lahko na Linux in OS X?

    Zakaj ne morem spremeniti v uporabi datotek na Windows, kot sem lahko na Linux in OS X?


    Če uporabljate Linux in OS X, vam operacijski sistem ne bo preprečil brisanja datoteke, ki je trenutno v uporabi, vendar v sistemu Windows vam bo to izrecno prepovedano. Kaj daje? Zakaj lahko urejate in brišete datoteke v uporabi v sistemih, pridobljenih iz Unixa, vendar ne v sistemu Windows?

    Današnja seja vprašanj in odgovorov prihaja z namenom SuperUser-a, ki je del skupine Stack Exchange, ki temelji na skupnostih spletnih mest za vprašanja in odgovore.

    Vprašanje

    Bralnik SuperUser the.midget želi vedeti, zakaj Linux in Windows različno uporabljata datoteke v uporabi:

    Ena od stvari, ki me je zbudila odkar sem začel uporabljati Linux, je dejstvo, da vam omogoča, da spremenite ime datoteke ali jo celo izbrišete med branjem. Primer je, kako sem pomotoma poskušal izbrisati videoposnetek med predvajanjem. Uspelo mi je in bila sem presenečena, ko sem izvedela, da lahko spreminjate skoraj vse, kar je v datoteki, ne da bi skrbeli, ali se trenutno uporablja ali ne.

    Torej, kaj se dogaja v zakulisju in mu preprečuje, da bi v Linuxu samovoljno izbrisal stvari, kot je mogoče v Linuxu?

    Odgovor

    Sodelavci SuperUser so osvetlili situacijo za spletno stran. Amazed piše:

    Vsakič, ko odprete ali izvršite datoteko v sistemu Windows, Windows zaklene datoteko na mestu (to je poenostavitev, vendar ponavadi resnična.) Datoteke, ki jih je proces zaklenil, ni mogoče izbrisati, dokler ga proces ne sprosti. To je razlog, zakaj vsakič, ko se mora Windows posodobiti, potrebujete ponovni zagon, da bo začel veljati.

    Po drugi strani pa Unixu podobni operacijski sistemi, kot sta Linux in Mac OS X, ne zaklenejo datoteke, temveč osnovni sektorji diskov. To se lahko zdi nepomembno razlikovanje, vendar to pomeni, da je zapis datoteke v kazalu datotečnega sistema mogoče izbrisati, ne da bi motili kateri koli program, ki že ima odprto datoteko. Tako lahko datoteko izbrišete, medtem ko se še izvaja ali drugače uporabljate, in bo še naprej obstajala na disku, dokler bo nek proces imel odprto ročico, čeprav je njen vnos v tabeli datotek izginil..

    David Schwartz razširja idejo in poudarja, kako bi morale biti stvari idealne in kako so v praksi:

    Windows privzeto samodejno, obvezno zaklepanje datotek. UNIX-i privzeto nastavijo ročno, kooperativno zaklepanje datotek. V obeh primerih lahko privzete nastavitve prekoračite, v obeh primerih pa ponavadi niso.

    Veliko starih kod Windows uporablja C / C ++ API (funkcije, kot je fopen), ne pa native API (funkcije, kot so CreateFile). API C / C ++ vam ne omogoča, da določite, kako bo delovalo obvezno zaklepanje, tako da boste dobili privzete nastavitve. Privzeti »način skupne rabe« prepoveduje »konfliktne« operacije. Če datoteko odprete za pisanje, se šteje, da je zapisovanje konfliktno, tudi če nikoli dejansko ne pišete v datoteko. Enako za preimenovanja.

    In tukaj je še slabše. Razen odpiranja za branje ali pisanje, C / C ++ API ne nudi nobenega načina, da bi določili, kaj nameravate narediti z datoteko. API mora torej domnevati, da boste izvedli kakršno koli pravno operacijo. Ker je zaklepanje obvezno, bo odprtina, ki dovoljuje operacijo v sporu, zavrnjena, tudi če koda nikoli ni nameravala izvesti sporne operacije, ampak je samo odprla datoteko za drug namen..

    Če torej koda uporablja C / C ++ API ali uporablja nativni API brez posebnega razmišljanja o teh vprašanjih, se bo končalo s preprečevanjem največjega števila možnih operacij za vsako datoteko, ki jo odprejo, in ne bo mogla odpreti datoteke, razen če bodo vse možne operacije lahko na njem opravite, ko je odprta, je neskladna.

    Po mojem mnenju bi metoda Windows delovala veliko bolje kot metoda UNIX, če bi vsak program modro izbral svoje načine skupne rabe in odprte načine ter skrbno obravnaval primere neuspeha. Vendar pa metoda UNIX deluje bolje, če koda ne moti razmišljanja o teh vprašanjih. Na žalost se osnovni C / C ++ API ne ujema z API-jem datotek Windows na način, ki obravnava načine skupne rabe in se dobro odpre. Torej je neto rezultat malo neurejen.

    Tam imate to: dva različna pristopa do rokovanja z datotekami ustvarjata dva različna rezultata.


    Imate kaj dodati pojasnilu? Zvok izključen v komentarjih. Želite prebrati več odgovorov drugih uporabnikov tehnologije Stack Exchange? Oglejte si celotno nit razprave tukaj.