17Aug

Prečo nemôžem meniť používané súbory v systéme Windows ako môžem na Linuxe a OS X?


Keď používate operačný systém Linux a operačný systém OS X, operačný systém vás nezastaví v odstraňovaní súboru, ktorý sa práve používa, ale v systéme Windows budete výslovne zakázaný.Čo dáva? Prečo môžete upravovať a odstraňovať súbory používané v systémoch odvodených od systému Unix, nie Windows?

Dnešná otázka &Odpoveď na zasadnutie nám príde s láskavým dovolením SuperUser - subdivíziu Stack Exchange, komunitne riadeného zoskupenia webových stránok Q & A.

Otázka

SuperUser čítačka the.midget chce vedieť, prečo Linux a Windows zaobchádza s inými používateľskými súbormi inak:

Jednou z vecí, ktorá ma zmätila od toho, čo som začala používať Linux, je skutočnosť, že vám umožňuje zmeniť názovsúbor alebo ho dokonca odstrániť počas čítania. Príkladom je, ako som sa náhodou pokúsil odstrániť video počas prehrávania. Podarilo sa mi to a bolo prekvapené, keď som sa dozvedel, že sa môžete zmeniť len v čomkoľvek dokumente bez starostlivosti o to, či sa v súčasnosti používa alebo nie.

Takže čo sa deje v zákulisí a bráni tomu, aby zbytočne vymazal veci v systéme Windows, ako by mohol v systéme Linux?

Odpovedia na odpoveď

SuperUser vysvetľujú situáciu. Amazed píše:

Vždy, keď otvoríte alebo spustíte súbor v systéme Windows, systém Windows zablokuje súbor( toto je zjednodušenie, ale zvyčajne je to pravda.) Súbor, ktorý je uzamknutý procesom, sa nedá odstrániť, kým ho proces neuvoľní.To je dôvod, prečo vždy, keď sa systém Windows musí sám aktualizovať, potrebujete reštart pre jeho efekt.

Na druhej strane operačné systémy podobné Unixu ako Linux a Mac OS X neuzamknú súbor, ale skôr podkladové diskové sektory. Môže sa to zdať triviálna diferenciácia, ale znamená to, že záznam súboru v tabuľke obsahového systému môže byť odstránený bez narušenia akéhokoľvek programu, ktorý už má súbor otvorený.Takže môžete odstrániť súbor, zatiaľ čo sa stále vykonáva alebo inak používa a bude naďalej existovať na disku, ak niektorý proces má otvorený popisovač, aj keď je jeho záznam v tabuľke súborov preč.

David Schwartz rozširuje túto myšlienku a zdôrazňuje, ako by mali byť ideálne veci a aké sú v praxi:

Windows je predvolené automatické, povinné uzamknutie súborov. UNIX je predvolené pre ručné, kooperačné blokovanie súborov. V obidvoch prípadoch môžu byť predvolené hodnoty zrušené, ale v oboch prípadoch zvyčajne nie sú.

Veľa starého kódu Windows používa C / C ++ API( funkcie ako fopen) skôr ako natívny API( funkcie ako CreateFile).Aplikácia C / C ++ API vám nedáva žiaden spôsob, ako špecifikovať, ako povinné uzamknutie bude fungovať, takže dostanete predvolené hodnoty. Predvolený režim zdieľania má tendenciu zakázať "konfliktné" operácie. Ak otvoríte súbor na písanie, predpokladá sa, že zápisy budú v konflikte, a to aj vtedy, keď nikdy do súboru nezapíšeme. Dôvod pre premenovanie.

A tu sa to zhoršuje. Iné ako otvorenie pre čítanie alebo zápis, C / C ++ API neposkytuje žiadny spôsob, ako špecifikovať, čo chcete so súborom urobiť.Takže API musí predpokladať, že budete vykonávať akúkoľvek právnu operáciu. Keďže uzamknutie je povinné, otvorenie, ktoré umožňuje konfliktnú operáciu, bude zamietnuté, aj keď kód nikdy nemal v úmysle vykonať konfliktnú operáciu, ale práve otvoril súbor na iný účel.

Takže ak kód používa C / C ++ API alebo používa nativné rozhranie API bez konkrétneho uvažovania o týchto problémoch, skončí zabránením maximálnej množine možných operácií pre každý súbor, ktorý otvoria a nedokáže otvoriť súbor, pokiaľ nie je možná každá možná operáciamohli na ňom vystúpiť, akonáhle bol otvorený, nie je konfliktné.

Podľa môjho názoru by metóda systému Windows fungovala oveľa lepšie ako metóda UNIX, ak každý program si vybral svoje režimy zdieľania a otvorené režimy múdro a šikovne riešili prípady porúch. Metóda UNIX však funguje lepšie, ak sa kód neobťažuje, aby o týchto problémoch premýšľal. Bohužiaľ, základné rozhranie C / C ++ API neaplikuje správne API súborov systému Windows spôsobom, ktorý spracúva režimy zdieľania a konflikt sa otvorí dobre. Takže čistý výsledok je trochu chaotický.

Tu máte: dva rôzne prístupy k spracovaniu súborov prinášajú dva rôzne výsledky.

Musíte niečo doplniť k vysvetleniu? Zvuk vypnúť v komentároch. Chcete si prečítať viac odpovedí od iných používateľov technológie Stack Exchange? Pozrite sa na celý diskusný príspevok tu.