Dela via


Skapa och öppna filer

Funktionen CreateFile kan skapa en ny fil eller öppna en befintlig fil. Du måste ange filnamn, skapandeinstruktioner och andra attribut. När ett program skapar en ny fil lägger operativsystemet till den i den angivna katalogen.

Arbeta med filer i ditt program

Operativsystemet tilldelar en unik identifierare, kallad ett handtag, till varje fil som öppnas eller skapas med hjälp av CreateFile. Ett program kan använda det här handtaget med funktioner som läser från, skriver till och beskriver filen. Det är giltigt tills alla referenser till handtaget har stängts. När en applikation startar, ärver den alla öppna handtag från den startande processen, förutsatt att handtagen skapades som ärvbara.

Ett program bör kontrollera värdet för referensen som returneras av CreateFile innan du försöker använda referensen för att komma åt filen. Om ett fel uppstår blir referensvärdet INVALID_HANDLE_VALUE och programmet kan använda funktionen GetLastError för utökad felinformation.

När ett program använder CreateFile måste det använda parametern dwDesiredAccess för att ange om det ska läsa från filen, skriva till filen, både läsa och skriva eller ingetdera. Detta kallas för att begära ett åtkomstläge. Programmet måste också använda parametern dwCreationDisposition för att ange vilken åtgärd som ska vidtas om filen redan finns, känt som skapandedisposition. Ett program kan till exempel anropa CreateFile med dwCreationDisposition inställt på CREATE_ALWAYS för att alltid skapa en ny fil, även om det redan finns en fil med samma namn (vilket skriver över den befintliga filen). Om detta lyckas eller inte beror på faktorer som den tidigare filens attribut och säkerhetsinställningar (se följande avsnitt för mer information).

Ett program använder också CreateFile för att ange om det vill dela filen för läsning, skrivning, båda eller ingetdera. Detta kallas delningsläge. En öppen fil som inte delas (dwShareMode inställd på noll) kan inte öppnas igen, antingen av programmet som öppnade den eller av ett annat program, förrän dess handtag har stängts. Detta kallas även exklusiv åtkomst.

När en process använder CreateFile för att försöka öppna en fil som redan har öppnats i delningsläge (dwShareMode inställt på ett giltigt värde som inte är noll) jämför systemet de begärda åtkomst- och delningslägena med de som angavs när filen öppnades. Om du anger ett åtkomst- eller delningsläge som står i konflikt med de lägen som angavs i föregående anrop misslyckas CreateFile .

I följande tabell visas giltiga kombinationer av två anrop till CreateFile med olika åtkomstlägen och delningslägen (dwDesiredAccess respektive dwShareMode ). Det spelar ingen roll i vilken ordning CreateFile-anropen görs. Eventuella efterföljande fil-I/O-åtgärder på varje filreferens kommer dock fortfarande att begränsas av de aktuella åtkomst- och delningslägena som är associerade med det specifika filhandtaget.

Första anropet till CreateFile Giltiga andra anrop till CreateFile
GENERIC_READ, FILE_SHARE_READ - GENERIC_READ, FILE_SHARE_READ
- GENERIC_READ, FILE_SHARE_READ, FILE_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

Förutom standardfilattributen kan du även ange säkerhetsattribut genom att inkludera en pekare till en SECURITY_ATTRIBUTES struktur som den fjärde parametern i CreateFile. Det underliggande filsystemet måste dock ha stöd för säkerhet för att detta ska ha någon effekt (till exempel stöder NTFS-filsystemet det, men de olika FAT-filsystemen gör det inte). Mer information om säkerhetsattribut finns i Åtkomstkontroll.

Ett program som skapar en ny fil kan ange ett valfritt handtag till en mallfil, från vilken CreateFile tar filattribut och utökade attribut för att skapa den nya filen.

CreateFile-scenarier

Det finns flera grundläggande scenarier för att initiera åtkomst till en fil med funktionen CreateFile . Dessa sammanfattas som:

  • Att skapa en ny fil när en fil med det namnet inte redan finns.
  • Skapa en ny fil även om det redan finns en fil med samma namn, rensa dess data och börja från början med en tom fil.
  • Öppna en befintlig fil endast om den finns och endast intakt.
  • Öppna en befintlig fil endast om den finns och trunkera den så att den är tom.
  • Öppna alltid en fil: as-is om den finns och skapa en ny om den inte finns.

Dessa scenarier styrs av korrekt användning av parametern dwCreationDisposition . Nedan visas en uppdelning av hur dessa scenarier mappas till värden för den här parametern och vad som händer när de används.

När du skapar eller öppnar en ny fil när en fil med det namnet inte redan finns (dwCreationDisposition inställd på antingen CREATE_NEW, CREATE_ALWAYS eller OPEN_ALWAYS) utför funktionen CreateFile följande åtgärder:

  • Kombinerar filattributen och flaggorna som anges av dwFlagsAndAttributes med FILE_ATTRIBUTE_ARCHIVE.
  • Anger fillängden till noll.
  • Kopierar de utökade attribut som tillhandahålls av mallfilen till den nya filen om parametern hTemplateFile anges (detta åsidosätter alla FILE_ATTRIBUTE_* flaggor som angavs tidigare).
  • Anger ärvflaggan som anges av bInheritHandle-medlemmen och säkerhetsbeskrivningen som anges av lpSecurityDescriptor-medlemmen i parametern lpSecurityAttributes (SECURITY_ATTRIBUTES struktur), om den tillhandahålls.

När du skapar en ny fil även om det redan finns en fil med samma namn (dwCreationDisposition inställd på CREATE_ALWAYS) utför funktionen CreateFile följande åtgärder:

  • Kontrollerar aktuella filattribut och säkerhetsinställningar för skrivåtkomst, misslyckas om de nekas.
  • Kombinerar de filattribut och flaggor som anges av dwFlagsAndAttributes med FILE_ATTRIBUTE_ARCHIVE och befintliga filattribut.
  • Anger fillängden till noll (d.s. alla data som fanns i filen är inte längre tillgängliga och filen är tom).
  • Kopierar de utökade attribut som tillhandahålls av mallfilen till den nya filen om parametern hTemplateFile anges (detta åsidosätter alla FILE_ATTRIBUTE_* flaggor som angavs tidigare).
  • Anger ärvflaggan som anges av bInheritHandle-medlemmen i parametern lpSecurityAttributes (SECURITY_ATTRIBUTES struktur) om den tillhandahålls, men ignorerar lpSecurityDescriptor-medlemmen i SECURITY_ATTRIBUTES-strukturen .
  • Om det annars lyckas (det vill: CreateFile returnerar ett giltigt handtag) ger anropet GetLastError koden ERROR_ALREADY_EXISTS, även om det för det här specifika användningsfallet inte är ett fel som sådant (om du avsåg att skapa en "ny" (tom) fil i stället för den befintliga).

När du öppnar en befintlig fil (dwCreationDisposition inställd på antingen OPEN_EXISTING, OPEN_ALWAYS eller TRUNCATE_EXISTING) utför funktionen CreateFile följande åtgärder:

  • Kontrollerar aktuella filattribut och säkerhetsinställningar för begärd åtkomst och misslyckas om de nekas.
  • Kombinerar filflaggor (FILE_FLAG_*) som anges av dwFlagsAndAttributes med befintliga filattribut och ignorerar alla filattribut (FILE_ATTRIBUTE_*) som anges av dwFlagsAndAttributes.
  • Anger fillängden till noll endast om dwCreationDisposition är inställt på TRUNCATE_EXISTING, annars underhålls den aktuella fillängden och filen öppnas as-is.
  • Ignorerar parametern hTemplateFile .
  • Anger ärvflaggan som anges av bInheritHandle-medlemmen i parametern lpSecurityAttributes (SECURITY_ATTRIBUTES struktur) om den tillhandahålls, men ignorerar lpSecurityDescriptor-medlemmen i SECURITY_ATTRIBUTES-strukturen .

Filattribut och kataloger

Filattribut är en del av metadata som är associerade med en fil eller katalog, var och en med sitt eget syfte och regler för hur den kan anges och ändras. Vissa av dessa attribut gäller endast för filer och vissa endast för kataloger. Attributet FILE_ATTRIBUTE_DIRECTORY gäller till exempel endast kataloger: Det används av filsystemet för att avgöra om ett objekt på disken är en katalog, men det kan inte ändras för ett befintligt filsystemobjekt.

Vissa filattribut kan anges för en katalog men har endast betydelse för filer som skapats i katalogen, som fungerar som standardattribut. Till exempel kan FILE_ATTRIBUTE_COMPRESSED anges på ett katalogobjekt, men eftersom själva katalogobjektet inte innehåller några faktiska data komprimeras det inte riktigt. Kataloger som har markerats med det här attributet uppmanar dock filsystemet att komprimera alla nya filer som läggs till i katalogen. Alla filattribut som kan anges i en katalog och som också anges för nya filer som läggs till i katalogen kallas ett ärvt attribut.

Funktionen CreateFile innehåller en parameter för att ange vissa filattribut när en fil skapas. I allmänhet är de här attributen de vanligaste för ett program att använda när filen skapas, men inte alla möjliga filattribut är tillgängliga för CreateFile. Vissa filattribut kräver användning av andra funktioner, till exempel SetFileAttributes, DeviceIoControl eller DecryptFile när filen redan finns. När det gäller FILE_ATTRIBUTE_DIRECTORY krävs funktionen CreateDirectory vid skapandetillfället eftersom CreateFile inte kan skapa kataloger. De andra filattributen som kräver särskild hantering är FILE_ATTRIBUTE_REPARSE_POINT och FILE_ATTRIBUTE_SPARSE_FILE, som kräver DeviceIoControl. Mer information finns i SetFileAttributes.

Som tidigare nämnts sker arv av filattribut när en fil skapas med filattribut som lästs från katalogattributen där filen ska finnas. I följande tabell sammanfattas dessa ärvda attribut och hur de relaterar till CreateFile-funktioner .

Katalogattributtillstånd CreateFile-arvs åsidosättningsfunktion för nya filer
FILE_ATTRIBUTE_COMPRESSED inställt. Ingen kontroll. Använd DeviceIoControl för att rensa.
FILE_ATTRIBUTE_COMPRESSED inte inställd. Ingen kontroll. Använd DeviceIoControl för att ange.
FILE_ATTRIBUTE_ENCRYPTED inställd. Ingen kontroll. Använd DecryptFile.
FILE_ATTRIBUTE_ENCRYPTED inte angett. Kan ställas in med CreateFile.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED satt. Ingen kontroll. Använd SetFileAttributes för att rensa.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED inte inställt. Ingen kontroll. Använd SetFileAttributes för att ange.

Åtkomstkontroll

CreateFile

DeviceIoControl (på engelska)

Filattributkonstanter

filkomprimering och dekomprimering

Filkryptering

Filhanteringsfunktioner

referenser och objekt

hantera arv

Öppna en fil för att läsa eller skriva

SetFileAttributes