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

    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, nebude vás zabraňovať v odstraňovaní aktuálne používaného súboru, 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, ale nie Windows?

    Dnešná relácia otázok a odpovedí sa k nám pridelí zdvorilosťou SuperUser - podskupiny Stack Exchange, zoskupenia webových stránok typu Q & A.

    Otázka

    Čítačka SuperUser the.midget chce vedieť, prečo Linux a Windows zaobchádza s iným používaným súborom inak:

    Jedna z vecí, ktorá ma zmätila od toho, čo som začala používať Linux, je skutočnosť, že vám umožňuje meniť názov súboru alebo ho dokonca vymazať 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ť bez ohľadu na čokoľvek v súbore bez starostlivosti o to, či sa v súčasnosti používa alebo nie.

    Takže to, čo sa deje v zákulisí a zabraňuje tomu, aby zbytočne vymazal veci v systéme Windows, ako je to v Linuxe?

    Odpoveď

    Prispievatelia služby SuperUser prinášajú nejaké svetlo na situáciu. Amazed píše:

    Kedykoľvek otvoríte alebo spustíte súbor v systéme Windows, systém Windows zablokuje súbor na svojom mieste (ide o zjednodušenie, ale zvyčajne je to pravda.) Súbor, ktorý je uzamknutý procesom, sa nedá odstrániť, kým ho proces neuvoľní. Z tohto dôvodu sa vždy, keď sa systém Windows musí sám aktualizovať, potrebujete reštartovať, aby sa mohol prejaviť.

    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 zmizol.

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

    Systém Windows má predvolené automatické uzamknutie súborov. UNIX je predvolené pre manuálne uzamknutie súborov. V oboch prípadoch môžu byť predvolené hodnoty predbežné, ale v oboch prípadoch zvyčajne nie sú.

    Veľa starého kódu Windows používa C / C ++ API (funkcie ako fopen) a nie natívny API (funkcie ako CreateFile). Aplikácia C / C ++ API vám nedáva žiadny spôsob, ako určiť, ako bude povinné uzamknutie fungovať, aby ste získali 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, aj keď v skutočnosti nikdy do súboru nezapíšeme. Dôvod pre premenovanie.

    A tu sa to zhoršuje. Iné ako otvorenie pre čítanie alebo zápis, API C / C ++ 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é, bude otvorené, ktoré umožňuje konfliktnú operáciu, odmietnuté, aj keď kód nikdy nebol určený na vykonanie konfliktnej operácie, ale práve otvoril súbor na iný účel.

    Takže ak kód používa rozhranie C / C ++ API alebo používa natívne rozhranie API bez toho, aby konkrétne premýšľal o týchto problémoch, ukončí zabránenie maximálnemu súboru možných operácií pre každý súbor, ktorý otvoria, a nedokáže otvoriť súbor, pokiaľ to nie je možné. mohol vykonať na ňom, keď 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 kód neobťažuje premýšľať o týchto problémoch. Bohužiaľ, základné rozhranie C / C ++ API neaplikuje správne API súborov systému Windows spôsobom, ktorý rieši režimy zdieľania a konflikt sa otvorí dobre. Takže čistý výsledok je trochu chaotický.

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


    Máte niečo doplniť vysvetlenie? Vyjadrite sa v komentároch. Chcete sa dozvedieť viac odpovedí od iných používateľov technickej úrovne Stack Exchange? Pozrite sa na celý diskusný príspevok tu.