Domovská » jak » Proč nemohu změnit soubory v systému Windows jako já v Linuxu a OS X?

    Proč nemohu změnit soubory v systému Windows jako já v Linuxu a OS X?


    Používáte-li operační systém Linux a OS X, operační systém vás nezastaví v mazání aktuálně používaného souboru, avšak v systému Windows bude výslovně zakázáno. Co dává? Proč můžete upravovat a odstraňovat soubory používané v systémech odvozených Unix, ale ne Windows?

    Dnešní zasedání Otázky a odpovědi nás přichází s laskavým svolením SuperUser - podřízené rozdělení Stack Exchange, které je založeno na komunitě prostřednictvím skupin webových stránek.

    Otázka

    Čtečka SuperUser the.midget chce vědět, proč Linux a Windows zacházejí s různými způsoby použití souborů:

    Jedna z věcí, která mě od doby, kdy jsem začala používat Linux, mě zmátla, je skutečnost, že vám umožňuje měnit název souboru nebo dokonce jej smazat, když ho čtete. Příkladem je, že jsem se nechtěně pokusil smazat video během hraní. Podařilo se mi to a byl překvapen, když jsem se dozvěděl, že se můžete změnit bez ohledu na to, co se nachází v souboru bez péče,.

    Takže, co se děje v zákulisí a brání mu nechtěně smazat věci ve Windows, jako by mohl v Linuxu?

    Odpověď

    Přispěvatelé z SuperUseru trochu osvětli situaci. Amazed píše:

    Kdykoli otevřete nebo spustíte soubor v systému Windows, systém Windows uzamkne soubor na místě (je to zjednodušení, ale obvykle je to pravda.) Soubor, který je uzamčen procesem, nemůže být smazán, dokud se tento proces nevypne. To je důvod, proč vždy, když Windows musí aktualizovat sám, potřebujete restartování, aby se projevil.

    Na druhou stranu, operační systémy typu Unix, jako Linux a Mac OS X, neuzamknou soubor, nýbrž spíše podkladové diskové sektory. To se může zdát triviální diferenciace, ale znamená to, že záznam souboru v tabulce obsahu systému souborů může být odstraněn bez narušení jakéhokoli programu, který již soubor otevřel. Takže můžete soubor smazat, pokud je stále spuštěn nebo jinak používán a bude i nadále existovat na disku, pokud nějaký proces má otevřenou úchytku, i když jeho záznam v tabulce souborů je pryč.

    David Schwartz tuto myšlenku rozšiřuje a zdůrazňuje, jak by měly být věci v ideálním případě a jak jsou v praxi:

    Systém Windows automaticky nastavuje automatické blokování souborů. UNIX je výchozí k ručnímu, kooperativnímu blokování souborů. V obou případech mohou být výchozí hodnoty přepsány, ale v obou případech obvykle nejsou.

    Mnoho starých kódů Windows používá C / C ++ API (funkce jako fopen) spíše než nativní API (funkce jako CreateFile). Aplikace C / C ++ API vám neumožňuje určit, jak bude povinné zamykání fungovat, abyste získali výchozí nastavení. Výchozí režim sdílení má tendenci zakazovat "konfliktní" operace. Pokud otevřete soubor pro zápis, předpokládá se, že se píše do konfliktu, i když ve skutečnosti nikdy do souboru píšete. Ditto pro přejmenování.

    A tady se zhoršuje. Jiné než otevření pro čtení nebo zápis, C / C ++ API neumožňuje zadat, co máte v úmyslu udělat se souborem. API musí předpokládat, že budete provádět jakoukoli legální operaci. Vzhledem k tomu, že uzamčení je povinné, otevření, které umožňuje konfliktní operaci, bude odmítnuto, i když kód nikdy nechtěl provést konfliktní operaci, ale právě otevře soubor pro jiný účel.

    Takže pokud kód používá C / C ++ API nebo používá nativní API bez konkrétního uvažování o těchto problémech, ukončí zabránění maximální množině možných operací pro každý soubor, který otevře a nebude schopen otevřít soubor, pokud nebude možné všechny operace mohl na něm spustit, jakmile je otevřen, není konfliktní.

    Metoda systému Windows podle mého názoru by fungovala mnohem lépe než metoda UNIX, pokud by každý program zvolil režim sdílení a otevře režimy moudře a šetrně zpracovávaly případy selhání. Metoda UNIX však funguje lépe, pokud se kód neobtěžuje přemýšlet o těchto problémech. Bohužel, základní C / C ++ API mapovat dobře do API souboru Windows způsobem, který zpracovává režimy sdílení a konflikt se otevírá dobře. Takže čistý výsledek je trochu špinavý.

    Tam máte: dva různé přístupy k manipulaci se soubory přinášejí dva různé výsledky.


    Musíte něco přidat k vysvětlení? Vypadněte v komentářích. Chcete se dozvědět více odpovědí od ostatních uživatelů technologie Stack Exchange? Podívejte se na celý diskusní příspěvek zde.