Bestanden maken en openen
Met de functie CreateFile kunt u een nieuw bestand maken of een bestaand bestand openen. U moet de bestandsnaam, aanmaakinstructies en andere kenmerken opgeven. Wanneer een toepassing een nieuw bestand maakt, wordt dit door het besturingssysteem toegevoegd aan de opgegeven map.
Het besturingssysteem wijst een unieke id, een zogenaamde handle, toe aan elk bestand dat wordt geopend of gemaakt met behulp van CreateFile. Een toepassing kan deze handle gebruiken met functies die het bestand lezen, beschrijven en naar het bestand schrijven. Het is geldig totdat alle verwijzingen naar die ingang zijn gesloten. Wanneer een toepassing wordt gestart, erft deze alle open handles van het proces dat het heeft gestart, mits de handles als overerfbaar zijn aangemaakt.
Een toepassing moet de waarde controleren van de ingang die wordt geretourneerd door CreateFile- voordat u de ingang probeert te gebruiken voor toegang tot het bestand. Als er een fout optreedt, wordt de handlewaarde INVALID_HANDLE_VALUE en kan de toepassing de functie GetLastError gebruiken voor uitgebreide foutinformatie.
Wanneer een toepassing gebruikmaakt van CreateFile, moet deze de parameter dwDesiredAccess gebruiken om op te geven of het van het bestand wil lezen, schrijven naar het bestand, zowel lezen als schrijven, of geen van beide. Dit staat bekend als het aanvragen van een -toegangsmodus. De toepassing moet ook de parameter dwCreationDisposition gebruiken om op te geven welke actie moet worden ondernomen als het bestand al bestaat, wat bekend staat als de creatiecondition. Een toepassing kan bijvoorbeeld CreateFile- aanroepen met dwCreationDisposition- ingesteld op CREATE_ALWAYS om altijd een nieuw bestand te maken, zelfs als er al een bestand met dezelfde naam bestaat (waardoor het bestaande bestand wordt overschreven). Of dit wel of niet lukt, is afhankelijk van factoren zoals de kenmerken en beveiligingsinstellingen van het vorige bestand (zie de volgende secties voor meer informatie).
Een toepassing maakt ook gebruik van CreateFile- om op te geven of het bestand wil delen voor lezen, schrijven, beide of geen van beide. Dit staat bekend als de -modus om te delen. Een geopend bestand dat niet wordt gedeeld (dwShareMode ingesteld op nul) kan niet opnieuw worden geopend door de toepassing die het heeft geopend of door een andere toepassing, totdat de ingang is gesloten. Dit wordt ook wel exclusieve toegang genoemd.
Wanneer een proces gebruikmaakt van CreateFile- om te proberen een bestand te openen dat al is geopend in een deelmodus (dwShareMode ingesteld op een geldige niet-nulwaarde), vergelijkt het systeem de aangevraagde toegangs- en deelmodi met degene die zijn opgegeven toen het bestand werd geopend. Als u een toegangs- of deelmodus opgeeft die conflicteert met de modi die zijn opgegeven in de vorige aanroep, mislukt CreateFile-.
De volgende tabel illustreert de geldige combinaties van twee aanroepen naar CreateFile met behulp van verschillende toegangsmodi en deelmodi (dwDesiredAccess, dwShareMode respectievelijk). Het maakt niet uit in welke volgorde de CreateFile aanroepen worden gedaan. Eventuele volgende bestands-I/O-bewerkingen op elke bestandsingang worden echter nog steeds beperkt door de huidige toegangs- en deelmodi die zijn gekoppeld aan die specifieke bestandsingang.
Eerste aanroep naar CreateFile | Geldige tweede oproepen naar CreateFile |
---|---|
GENERIC_READ, FILE_SHARE_READ |
|
GENERIC_READ, FILE_SHARE_WRITE |
|
GENERIC_READ, FILE_SHARE_READ, FILE_SHARE_WRITE |
|
GENERIC_WRITE, FILE_SHARE_READ |
|
GENERIC_WRITE, FILE_SHARE_WRITE |
|
GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE |
|
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ |
|
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_WRITE |
|
GENERIC_READ, GENERIC_WRITE, FILE_SHARE_READ, FILE_SHARE_WRITE |
|
Naast de standaardbestandskenmerken kunt u ook beveiligingskenmerken opgeven door een aanwijzer op te geven naar een SECURITY_ATTRIBUTES structuur als de vierde parameter van CreateFile-. Het onderliggende bestandssysteem moet echter beveiliging hiervoor ondersteunen om enig effect te hebben (bijvoorbeeld het NTFS-bestandssysteem ondersteunt het, maar de verschillende FAT-bestandssystemen niet). Zie Access Controlvoor meer informatie over beveiligingskenmerken.
Een toepassing die een nieuw bestand maakt, kan een optionele ingang leveren aan een sjabloonbestand, waaruit CreateFile- bestandskenmerken en uitgebreide kenmerken gebruikt voor het maken van het nieuwe bestand.
CreateFile-scenario's
Er zijn verschillende fundamentele scenario's voor het initiƫren van toegang tot een bestand met behulp van de functie CreateFile. Deze worden samengevat als:
- Een nieuw bestand maken wanneer er nog geen bestand met die naam bestaat.
- Een nieuw bestand aanmaken, zelfs als er al een bestand met dezelfde naam bestaat, waarbij de gegevens gewist worden en het bestand leeg begint.
- Een bestaand bestand openen alleen als het daadwerkelijk bestaat en intact is.
- Een bestaand bestand openen alleen als het bestaat, en het inkorten om leeg te zijn.
- Een bestand altijd openen: as-is als het bestaat, een nieuw bestand maken als het niet bestaat.
Deze scenario's worden beheerd door het juiste gebruik van de parameter dwCreationDisposition. Hieronder ziet u een overzicht van hoe deze scenario's overeenkomen met waarden voor deze parameter en wat er gebeurt wanneer ze worden gebruikt.
Wanneer u een nieuw bestand maakt of opent wanneer er nog geen bestand met die naam bestaat (dwCreationDisposition ingesteld op CREATE_NEW, CREATE_ALWAYSof OPEN_ALWAYS), voert de functie CreateFile de volgende acties uit:
- Combineert de bestandskenmerken en -vlaggen die zijn opgegeven door dwFlagsAndAttributes- met FILE_ATTRIBUTE_ARCHIVE.
- Hiermee stelt u de lengte van het bestand in op nul.
- Kopieert de uitgebreide kenmerken die door het sjabloonbestand worden opgegeven naar het nieuwe bestand als de parameter hTemplateFile is opgegeven (hiermee worden alle FILE_ATTRIBUTE_* vlaggen die eerder zijn opgegeven, overschreven).
- Hiermee stelt u de overneemvlag in die is opgegeven door het bInheritHandle-lid en de beveiligingsdescriptor die is opgegeven door het lpSecurityDescriptor-lid van de lpSecurityAttributes-parameter (structuur vanSECURITY_ATTRIBUTES), indien opgegeven.
Wanneer u een nieuw bestand maakt, zelfs als er al een bestand met dezelfde naam bestaat (dwCreationDisposition ingesteld op CREATE_ALWAYS), voert de functie CreateFile de volgende acties uit:
- Controleert de huidige bestandskenmerken en beveiligingsinstellingen voor schrijftoegang, mislukt als dit wordt geweigerd.
- Combineert de bestandskenmerken en vlaggen die zijn opgegeven door dwFlagsAndAttributes- met FILE_ATTRIBUTE_ARCHIVE en de bestaande bestandskenmerken.
- Hiermee stelt u de lengte van het bestand in op nul (dat wil gezegd: alle gegevens in het bestand zijn niet meer beschikbaar en het bestand is leeg).
- Kopieert de uitgebreide kenmerken die door het sjabloonbestand worden opgegeven naar het nieuwe bestand als de parameter hTemplateFile is opgegeven (hiermee worden alle FILE_ATTRIBUTE_* vlaggen die eerder zijn opgegeven, overschreven).
- Hiermee stelt u de overnamevlag in die is opgegeven door het bInheritHandle- lid van de lpSecurityAttributes parameter (SECURITY_ATTRIBUTES structuur) indien opgegeven, maar negeert u het lpSecurityDescriptor lid van de SECURITY_ATTRIBUTES structuur.
- Indien anders succesvol (dat wil zeggen, retourneert CreateFile een geldige handle), levert het aanroepen van GetLastError de code ERROR_ALREADY_EXISTSop, ook al is het voor dit specifieke geval geen echte fout (als u van plan was een nieuw (leeg) bestand te maken op de plek van het bestaande).
Bij het openen van een bestaand bestand (dwCreationDisposition ingesteld op OPEN_EXISTING, OPEN_ALWAYSof TRUNCATE_EXISTING), voert de functie CreateFile de volgende acties uit:
- Controleert de huidige bestandskenmerken en beveiligingsinstellingen op aangevraagde toegang, mislukt als dit wordt geweigerd.
- Combineert de bestandsvlagmen (FILE_FLAG_*) die zijn opgegeven door dwFlagsAndAttributes- met bestaande bestandskenmerken en negeert alle bestandskenmerken (FILE_ATTRIBUTE_*) die zijn opgegeven door dwFlagsAndAttributes-.
- Hiermee stelt u de lengte van het bestand alleen in op nul als dwCreationDisposition is ingesteld op TRUNCATE_EXISTING, anders blijft de huidige bestandsgrootte behouden en wordt het bestand geopend as-is.
- Hiermee negeert u de parameter hTemplateFile.
- Hiermee stelt u de overneemvlag in die is opgegeven door het bInheritHandle- lid van de lpSecurityAttributes parameter (SECURITY_ATTRIBUTES structuur) indien opgegeven, maar negeert u het lpSecurityDescriptor lid van de SECURITY_ATTRIBUTES structuur.
Bestandskenmerken en mappen
Bestandskenmerken maken deel uit van de metagegevens die zijn gekoppeld aan een bestand of map, elk met een eigen doel en regels voor het instellen en wijzigen ervan. Sommige van deze kenmerken zijn alleen van toepassing op bestanden en sommige alleen op mappen. Het kenmerk FILE_ATTRIBUTE_DIRECTORY is bijvoorbeeld alleen van toepassing op mappen: het wordt door het bestandssysteem gebruikt om te bepalen of een object op schijf een map is, maar kan niet worden gewijzigd voor een bestaand bestandssysteemobject.
Sommige bestandskenmerken kunnen worden ingesteld voor een map, maar hebben alleen betekenis voor bestanden die in die map zijn gemaakt, die fungeren als standaardkenmerken. FILE_ATTRIBUTE_COMPRESSED kan bijvoorbeeld worden ingesteld op een mapobject, maar omdat het mapobject zelf geen werkelijke gegevens bevat, wordt het niet echt gecomprimeerd; mappen die zijn gemarkeerd met dit kenmerk, geven echter aan dat het bestandssysteem nieuwe bestanden moet comprimeren die aan die map zijn toegevoegd. Elk bestandskenmerk dat kan worden ingesteld in een map en wordt ook ingesteld voor nieuwe bestanden die aan die map worden toegevoegd, wordt een overgenomen kenmerkgenoemd.
De functie CreateFile biedt een parameter voor het instellen van bepaalde bestandskenmerken wanneer een bestand wordt gemaakt. Over het algemeen zijn deze kenmerken het meest gebruikelijk voor een toepassing die moet worden gebruikt tijdens het maken van bestanden, maar niet alle mogelijke bestandskenmerken zijn beschikbaar voor CreateFile. Voor sommige bestandskenmerken is het gebruik van andere functies vereist, zoals SetFileAttributes, DeviceIoControlof DecryptFile nadat het bestand al bestaat. In het geval van FILE_ATTRIBUTE_DIRECTORYis de functie CreateDirectory vereist tijdens het maken, omdat CreateFile- geen mappen kan maken. De andere bestandskenmerken waarvoor speciale verwerking is vereist, zijn FILE_ATTRIBUTE_REPARSE_POINT en FILE_ATTRIBUTE_SPARSE_FILE, waarvoor DeviceIoControl-is vereist. Zie SetFileAttributesvoor meer informatie.
Zoals eerder vermeld, vindt overname van bestandskenmerken plaats wanneer een bestand wordt gemaakt met bestandskenmerken die worden gelezen uit de mapkenmerken waar het bestand zich bevindt. De volgende tabel bevat een overzicht van deze overgenomen kenmerken en hoe deze betrekking hebben op CreateFile mogelijkheden.
Status van adreslijstkenmerk | CreateFile overnamemogelijkheid voor nieuwe bestanden |
---|---|
FILE_ATTRIBUTE_COMPRESSED ingesteld. |
Geen controle. Gebruik DeviceIoControl om te wissen. |
FILE_ATTRIBUTE_COMPRESSED niet ingesteld. |
Geen controle. Gebruik DeviceIoControl- om in te stellen. |
FILE_ATTRIBUTE_ENCRYPTED ingesteld. |
Geen controle. Gebruik DecryptFile. |
FILE_ATTRIBUTE_ENCRYPTED niet ingesteld. |
Kan worden ingesteld met CreateFile-. |
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED ingesteld. |
Geen controle. Gebruik SetFileAttributes om bestandseigenschappen te wissen. |
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED niet ingesteld. |
Geen controle. Gebruik SetFileAttributes- om in te stellen. |