Sdílet prostřednictvím


Vytváření a otevírání souborů

Funkce CreateFile může vytvořit nový soubor nebo otevřít existující soubor. Musíte zadat název souboru, pokyny k vytvoření a další atributy. Když aplikace vytvoří nový soubor, operační systém ho přidá do zadaného adresáře.

Práce se soubory v aplikaci

Operační systém přiřadí každému otevřenému nebo vytvořenému souboru pomocí souboru CreateFile jedinečný identifikátor, který se nazývá popisovač. Aplikace může tento popisovač použít s funkcemi, které čtou ze souboru, zapisují do souboru a popisují jej. Platnost je platná, dokud nebudou uzavřeny všechny odkazy na popisovač. Při spuštění aplikace dědí všechny otevřené popisovače z procesu, který ji spustil, pokud byly popisovače vytvořeny jako dědičné.

Aplikace by měla před pokusem o přístup k souboru zkontrolovat hodnotu popisovače vráceného funkcí CreateFile. Pokud dojde k chybě, bude hodnota popisovače INVALID_HANDLE_VALUE a aplikace může použít funkci GetLastError pro rozšířené informace o chybách.

Pokud aplikace používá CreateFile, musí použít dwDesiredAccess parametr určit, zda má v úmyslu číst ze souboru, zapisovat do souboru, čtení i zápis nebo ani jedno. To se označuje jako žádost o režim přístupu. Aplikace musí také použít parametr dwCreationDisposition k určení akce, která se má provést, pokud soubor již existuje, označovaný jako vytvoření dispozice. Aplikace může například volat CreateFile s dwCreationDisposition nastavenou na CREATE_ALWAYS vždy vytvořit nový soubor, i když soubor se stejným názvem již existuje (tedy přepíše existující soubor). Jestli je to úspěšné nebo ne, závisí na faktorech, jako jsou atributy a nastavení zabezpečení předchozího souboru (další informace najdete v následujících částech).

Aplikace také používá CreateFile k určení, zda chce sdílet soubor pro čtení, zápis, obojí nebo ani jedno. To se označuje jako režim sdílení. Otevřený soubor, který není sdílený (dwShareMode nastaven na nulu), nelze znovu otevřít, a to buď aplikací, která ho otevřela, nebo jinou aplikací, dokud jeho popisovač nebude zavřen. Označuje se také jako výhradní přístup.

Když proces použije CreateFile k pokusu o otevření souboru, který již byl otevřen v režimu sdílení (dwShareMode nastaven na platnou nenulovou hodnotu), systém porovná požadované režimy přístupu a sdílení s režimy určenými při otevření souboru. Pokud zadáte režim přístupu nebo sdílení, který je v konfliktu s režimy zadanými v předchozím volání, CreateFile selže.

Následující tabulka ukazuje platné kombinace dvou volání CreateFile pomocí různých režimů přístupu a režimů sdílení (dwDesiredAccess, dwShareMode v uvedeném pořadí). Nezáleží na tom, v jakém pořadí se provádějí volání CreateFile . Všechny následné vstupně-výstupní operace se soubory na každém popisovači souborů budou stále omezené aktuálním režimem přístupu a sdílením přidruženým k danému popisovači souborů.

První volání createfile Platná druhá volání CreateFile
GENERIC_READ, FILE_SHARE_READ - GENERIC_READ, FILE_SHARE_READ
- GENERIC_READ, FILE_SHARE_READFILE_SHARE_WRITE
GENERIC_READ, FILE_SHARE_WRITE - GENERIC_WRITE, FILE_SHARE_READ
- GENERIC_WRITE, FILE_SHARE_READFILE_SHARE_WRITE
GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE - GENERIC_READ, FILE_SHARE_READ
- GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_WRITE, FILE_SHARE_READ
- GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_READGENERIC_WRITE, FILE_SHARE_READ
- GENERIC_READGENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ - GENERIC_READ, FILE_SHARE_WRITE
- GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_WRITE - GENERIC_WRITE, FILE_SHARE_WRITE
- GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE - GENERIC_READ, FILE_SHARE_WRITE
- GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_WRITE, FILE_SHARE_WRITE
- GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE
- GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ - GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE - GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE - GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE
- GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE

Kromě standardních atributů souboru můžete také zadat atributy zabezpečení zahrnutím ukazatele na SECURITY_ATTRIBUTES strukturu jako čtvrtý parametr CreateFile. Základní systém souborů však musí podporovat zabezpečení, aby to mělo jakýkoli vliv (například systém souborů NTFS ho podporuje, ale různé systémy souborů FAT ne). Další informace o atributech zabezpečení viz Řízení přístupu.

Aplikace, která vytváří nový soubor, může poskytnout volitelný popisovač šablony souboru, ze kterého CreateFile přebírá atributy souboru a rozšířené atributy pro vytvoření nového souboru.

Scénáře CreateFile

Existuje několik základních scénářů pro zahájení přístupu k souboru pomocí funkce CreateFile . Toto jsou shrnuté takto:

  • Vytvoření nového souboru, pokud soubor s tímto názvem ještě neexistuje.
  • Vytvoření nového souboru i v případě, že již existuje soubor se stejným názvem, vymažte jeho data a začněte prázdné.
  • Otevření existujícího souboru pouze v případě, že existuje, a pouze pokud je beze změny.
  • Otevření existujícího souboru pouze v případě, že existuje, jeho zkrácení na prázdné.
  • Při otevření souboru: as-is vždy, pokud již existuje; vytvořte nový soubor, pokud neexistuje.

Tyto scénáře se řídí správným použitím parametru dwCreationDisposition . Níže je rozpis toho, jak se tyto scénáře mapují na hodnoty pro tento parametr a co se stane, když se použijí.

Při vytváření nebo otevírání nového souboru, pokud soubor s tímto názvem ještě neexistuje (dwCreationDisposition nastaven na CREATE_NEW, CREATE_ALWAYS nebo OPEN_ALWAYS), provede funkce CreateFile následující akce:

  • Kombinuje atributy souboru a příznaky určené dwFlagsAndAttributes s FILE_ATTRIBUTE_ARCHIVE.
  • Nastaví délku souboru na nulu.
  • Zkopíruje rozšířené atributy zadané souborem šablony do nového souboru, pokud je zadaný parametr hTemplateFile (tím se přepíše všechny příznaky FILE_ATTRIBUTE_* zadané dříve).
  • Nastaví příznak dědění, jak je specifikováno členem bInheritHandle, a bezpečnostní popisovač specifikovaný členem lpSecurityDescriptor v rámci parametru lpSecurityAttributes (struktura SECURITY_ATTRIBUTES), pokud je zadán.

Při vytváření nového souboru i v případě, že již existuje soubor se stejným názvem (dwCreationDisposition nastaven na CREATE_ALWAYS), funkce CreateFile provede následující akce:

  • Kontroluje atributy aktuálního souboru a nastavení zabezpečení pro přístup k zápisu a při odepření selhává.
  • Kombinuje atributy souboru a příznaky určené dwFlagsAndAttributes s FILE_ATTRIBUTE_ARCHIVE a existující atributy souboru.
  • Nastaví délku souboru na nulu (to znamená, že všechna data, která byla v souboru, už nejsou k dispozici a soubor je prázdný).
  • Zkopíruje rozšířené atributy zadané souborem šablony do nového souboru, pokud je zadaný parametr hTemplateFile (tím se přepíše všechny příznaky FILE_ATTRIBUTE_* zadané dříve).
  • Nastaví příznak dědění určený členem bInheritHandle členu lpSecurityAttributes parametru (SECURITY_ATTRIBUTES struktura), pokud je zadán, ale ignoruje člen lpSecurityDescriptor členu SECURITY_ATTRIBUTES struktury.
  • Pokud je jinak úspěšný (to znamená, že CreateFile vrátí platný popisovač), volání GetLastError vrátí kód ERROR_ALREADY_EXISTS, i když pro tento konkrétní případ použití se ve skutečnosti nejedná o chybu (pokud jste chtěli vytvořit "nový" (prázdný) soubor místo existujícího souboru).

Při otevírání existujícího souboru (dwCreationDisposition nastavená na OPEN_EXISTING, OPEN_ALWAYS nebo TRUNCATE_EXISTING), provede funkce CreateFile následující akce:

  • Zkontroluje atributy aktuálního souboru a nastavení zabezpečení pro požadovaný přístup a při odepření selhává.
  • Kombinuje příznaky souboru (FILE_FLAG_*) určené dwFlagsAndAttributes s existujícími atributy souboru a ignoruje všechny atributy souboru (FILE_ATTRIBUTE_*) určené dwFlagsAndAttributes.
  • Nastaví délku souboru na nulu, pouze pokud je dwCreationDisposition nastavena na TRUNCATE_EXISTING, jinak je zachována aktuální délka souboru a soubor je otevřen as-is.
  • Ignoruje parametr hTemplateFile .
  • Nastaví příznak dědění určený členem bInheritHandle parametru lpSecurityAttributes struktura (SECURITY_ATTRIBUTES struktura), pokud je zadána, ale ignoruje člena lpSecurityDescriptor struktury SECURITY_ATTRIBUTES.

Atributy a adresáře souborů

Atributy souboru jsou součástí metadat přidružených k souboru nebo adresáři, přičemž každý z nich má svůj vlastní účel a pravidla pro nastavení a změny. Některé z těchto atributů se vztahují pouze na soubory a některé pouze na adresáře. Například atribut FILE_ATTRIBUTE_DIRECTORY platí pouze pro adresáře: Používá ho systém souborů k určení, zda je objekt na disku adresář, ale nelze jej změnit pro existující objekt systému souborů.

Některé atributy souboru lze nastavit pro adresář, ale mají význam pouze pro soubory vytvořené v daném adresáři, které fungují jako výchozí atributy. Například FILE_ATTRIBUTE_COMPRESSED lze nastavit u objektu adresáře, ale protože samotný objekt adresáře neobsahuje žádná skutečná data, není skutečně komprimován; adresáře označené tímto atributem však systému souborů říkají, aby komprimovat všechny nové soubory přidané do tohoto adresáře. Jakýkoli atribut souboru, který lze nastavit v adresáři a bude také nastaven pro nové soubory přidané do daného adresáře se označuje jako zděděný atribut.

Funkce CreateFile poskytuje parametr pro nastavení určitých atributů souboru při vytvoření souboru. Obecně platí, že tyto atributy jsou nejběžnější pro aplikaci, která se používá při vytváření souboru, ale ne všechny možné atributy souboru jsou k dispozici pro CreateFile. Některé atributy souboru vyžadují použití jiných funkcí, jako jsou SetFileAttributes, DeviceIoControl nebo DecryptFile, jakmile soubor již existuje. V případě FILE_ATTRIBUTE_DIRECTORY je funkce CreateDirectory vyžadována při vytváření, protože CreateFile nemůže vytvářet adresáře. Další atributy souboru, které vyžadují speciální zpracování, jsou FILE_ATTRIBUTE_REPARSE_POINT a FILE_ATTRIBUTE_SPARSE_FILE, které vyžadují DeviceIoControl. Další informace naleznete v tématu SetFileAttributes.

Jak jsme uvedli dříve, dědičnost atributů souboru nastane při vytvoření souboru s atributy souborů načtenými z atributů adresáře, kde se soubor nachází. Následující tabulka shrnuje tyto zděděné atributy a jejich vztah k možnostem CreateFile .

Stav atributu adresáře Možnost přepsání dědičnosti pomocí funkce "CreateFile" pro nové soubory
FILE_ATTRIBUTE_COMPRESSED nastaveno. Žádný ovládací prvek. K vymazání použijte DeviceIoControl .
FILE_ATTRIBUTE_COMPRESSED není nastaveno. Žádný ovládací prvek. K nastavení použijte DeviceIoControl .
FILE_ATTRIBUTE_ENCRYPTED nastaveno. Žádný ovládací prvek. Použijte DecryptFile.
FILE_ATTRIBUTE_ENCRYPTED není nastaven. Lze nastavit pomocí příkazu CreateFile.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED set. Žádný ovládací prvek. K vymazání použijte SetFileAttributes .
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED není nastaven. Žádný ovládací prvek. K nastavení použijte SetFileAttributes .

řízení přístupu

CreateFile

DeviceIoControl

Konstanty atributů souboru

Komprese a dekomprese souborů

Šifrování souborů

funkce správy souborů

úchyty a objekty

Řízení Dědičnosti

Otevření souboru pro čtení nebo zápis

SetFileAttributes