Erstellen und Öffnen von Dateien

Die CreateFile-Funktion kann eine neue Datei erstellen oder eine vorhandene Datei öffnen. Sie müssen den Dateinamen, die Erstellungsanweisungen und andere Attribute angeben. Wenn eine Anwendung eine neue Datei erstellt, fügt das Betriebssystem sie dem angegebenen Verzeichnis hinzu.

Das Betriebssystem weist jeder Datei, die mit CreateFile geöffnet oder erstellt wird, einen eindeutigen Bezeichner zu, der als Handle bezeichnet wird. Eine Anwendung kann dieses Handle mit Funktionen verwenden, die aus der Datei lesen, schreiben und beschreiben. Sie ist gültig, bis alle Verweise auf dieses Handle geschlossen sind. Wenn eine Anwendung gestartet wird, erbt sie alle geöffneten Handles von dem Prozess, der sie gestartet hat, wenn die Handles als vererbbar erstellt wurden.

Eine Anwendung sollte den Wert des von CreateFile zurückgegebenen Handles überprüfen, bevor sie versucht, das Handle für den Zugriff auf die Datei zu verwenden. Wenn ein Fehler auftritt, wird der Handlewert INVALID_HANDLE_VALUE , und die Anwendung kann die GetLastError-Funktion für erweiterte Fehlerinformationen verwenden.

Wenn eine Anwendung CreateFile verwendet, muss sie den dwDesiredAccess-Parameter verwenden, um anzugeben, ob sie aus der Datei lesen, in die Datei schreiben oder nicht. Dies wird als Anfordern eines Zugriffsmodus bezeichnet. Die Anwendung muss auch den DwCreationDisposition-Parameter verwenden, um anzugeben, welche Aktion ausgeführt werden soll, wenn die Datei bereits vorhanden ist, die als Erstellungsdisposition bezeichnet wird. Beispielsweise kann eine Anwendung CreateFile aufrufen, wobei dwCreationDisposition auf CREATE_ALWAYS festgelegt ist, um immer eine neue Datei zu erstellen, auch wenn bereits eine Datei mit demselben Namen vorhanden ist (wodurch die vorhandene Datei überschrieben wird). Ob dies erfolgreich ist oder nicht, hängt von Faktoren wie den Attributen und Sicherheitseinstellungen der vorherigen Datei ab (weitere Informationen finden Sie in den folgenden Abschnitten).

Eine Anwendung verwendet auch CreateFile , um anzugeben, ob sie die Datei zum Lesen, Schreiben oder zum Lesen freigeben möchte. Dies wird als Freigabemodus bezeichnet. Eine geöffnete Datei, die nicht freigegeben ist (dwShareMode auf null festgelegt), kann weder von der Anwendung, die sie geöffnet hat, noch von einer anderen Anwendung erneut geöffnet werden, bis ihr Handle geschlossen wurde. Dies wird auch als exklusiver Zugriff bezeichnet.

Wenn ein Prozess createFile verwendet, um zu versuchen, eine Datei zu öffnen, die bereits in einem Freigabemodus geöffnet wurde (dwShareMode ist auf einen gültigen Wert ungleich null festgelegt), vergleicht das System die angeforderten Zugriffs- und Freigabemodi mit denen, die beim Öffnen der Datei angegeben wurden. Wenn Sie einen Zugriffs- oder Freigabemodus angeben, der mit den im vorherigen Aufruf angegebenen Modi in Konflikt kommt, schlägt CreateFile fehl.

Die folgende Tabelle veranschaulicht die gültigen Kombinationen von zwei Aufrufen von CreateFile mithilfe verschiedener Zugriffsmodi und Freigabemodi (dwDesiredAccess, dwShareMode bzw. dwShareMode ). Es spielt keine Rolle, in welcher Reihenfolge die CreateFile-Aufrufe erfolgen. Alle nachfolgenden Datei-E/A-Vorgänge für jedes Dateihandle werden jedoch weiterhin durch den aktuellen Zugriffs- und Freigabemodus eingeschränkt, der diesem bestimmten Dateihandle zugeordnet ist.

Erster Aufruf von CreateFile Gültige zweite Aufrufe von 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

Zusätzlich zu den Standarddateiattributen können Sie auch Sicherheitsattribute angeben, indem Sie einen Zeiger auf eine SECURITY_ATTRIBUTES-Struktur als vierten Parameter von CreateFile einfügen. Das zugrunde liegende Dateisystem muss jedoch die Sicherheit unterstützen, damit dies auswirkungen kann (z. B. unterstützt das NTFS-Dateisystem dies, die verschiedenen FAT-Dateisysteme jedoch nicht). Weitere Informationen zu Sicherheitsattributen finden Sie unter Access Control.

Eine Anwendung, die eine neue Datei erstellt, kann ein optionales Handle für eine Vorlagendatei bereitstellen, aus der CreateFile Dateiattribute und erweiterte Attribute für die Erstellung der neuen Datei verwendet.

CreateFile-Szenarien

Es gibt mehrere grundlegende Szenarien zum Initiieren des Zugriffs auf eine Datei mithilfe der CreateFile-Funktion . Diese werden wie folgt zusammengefasst:

  • Erstellen einer neuen Datei, wenn noch keine Datei mit diesem Namen vorhanden ist.
  • Erstellen sie eine neue Datei, auch wenn eine Datei mit demselben Namen bereits vorhanden ist, löschen Sie die Daten, und beginnen Sie leer.
  • Eine vorhandene Datei wird nur geöffnet, wenn sie vorhanden und nur intakt ist.
  • Öffnen Sie eine vorhandene Datei nur, wenn sie vorhanden ist, und schneidet sie ab, damit sie leer ist.
  • Öffnen einer Datei immer: Unverändert, wenn vorhanden, und erstellen Sie eine neue Datei, wenn sie nicht vorhanden ist.

Diese Szenarien werden durch die ordnungsgemäße Verwendung des dwCreationDisposition-Parameters gesteuert. Im Folgenden finden Sie eine Übersicht darüber, wie diese Szenarien den Werten für diesen Parameter zugeordnet werden und was geschieht, wenn sie verwendet werden.

Beim Erstellen oder Öffnen einer neuen Datei, wenn eine Datei mit diesem Namen noch nicht vorhanden ist (dwCreationDisposition auf CREATE_NEW, CREATE_ALWAYS oder OPEN_ALWAYS festgelegt), führt die CreateFile-Funktion die folgenden Aktionen aus:

  • Kombiniert die von dwFlagsAndAttributes angegebenen Dateiattribute und Flags mit FILE_ATTRIBUTE_ARCHIVE.
  • Legt die Dateilänge auf 0 (null) fest.
  • Kopiert die erweiterten Attribute, die von der Vorlagendatei bereitgestellt werden, in die neue Datei, wenn der hTemplateFile-Parameter angegeben ist (dadurch werden alle zuvor angegebenen FILE_ATTRIBUTE_* -Flags außer Kraft gesetzt).
  • Legt das vom bInheritHandle-Member angegebene Vererbungsflag und den Sicherheitsdeskriptor fest, der vom lpSecurityDescriptor-Element des lpSecurityAttributes-Parameters (SECURITY_ATTRIBUTES-Struktur ) angegeben wird, sofern angegeben.

Wenn Sie eine neue Datei erstellen, auch wenn bereits eine Datei mit demselben Namen vorhanden ist (dwCreationDisposition auf CREATE_ALWAYS festgelegt), führt die CreateFile-Funktion die folgenden Aktionen aus:

  • Überprüft aktuelle Dateiattribute und Sicherheitseinstellungen auf Schreibzugriff, wenn verweigert.
  • Kombiniert die von dwFlagsAndAttributes angegebenen Dateiattribute und Flags mit FILE_ATTRIBUTE_ARCHIVE und den vorhandenen Dateiattributen.
  • Legt die Dateilänge auf 0 (d. a. alle Daten, die sich in der Datei befanden, sind nicht mehr verfügbar, und die Datei ist leer).
  • Kopiert die erweiterten Attribute, die von der Vorlagendatei bereitgestellt werden, in die neue Datei, wenn der hTemplateFile-Parameter angegeben ist (dadurch werden alle zuvor angegebenen FILE_ATTRIBUTE_* -Flags außer Kraft gesetzt).
  • Legt das vom bInheritHandle-Member des lpSecurityAttributes-Parameters (SECURITY_ATTRIBUTES-Struktur ) angegebene Vererbungsflag fest, sofern angegeben, ignoriert jedoch den lpSecurityDescriptor-Member der SECURITY_ATTRIBUTES-Struktur .
  • Wenn andernfalls erfolgreich war (d. a. gibt CreateFile ein gültiges Handle zurück), ergibt der Aufruf von GetLastError den Code ERROR_ALREADY_EXISTS, obwohl es sich für diesen speziellen Anwendungsfall nicht um einen Fehler handelt (wenn Sie eine "neue" (leere) Datei anstelle der vorhandenen erstellen möchten).

Beim Öffnen einer vorhandenen Datei (dwCreationDisposition auf OPEN_EXISTING, OPEN_ALWAYS oder TRUNCATE_EXISTING festgelegt) führt die CreateFile-Funktion die folgenden Aktionen aus:

  • Überprüft die aktuellen Dateiattribute und Sicherheitseinstellungen auf den angeforderten Zugriff, wenn verweigert.
  • Kombiniert die von dwFlagsAndAttributes angegebenen Dateiflags (FILE_FLAG_*) mit vorhandenen Dateiattributen und ignoriert alle von dwFlagsAndAttributes angegebenen Dateiattribute (FILE_ATTRIBUTE_*).
  • Legt die Dateilänge nur dann auf Null fest, wenn dwCreationDisposition auf TRUNCATE_EXISTING festgelegt ist. Andernfalls wird die aktuelle Dateilänge beibehalten und die Datei unverändert geöffnet.
  • Ignoriert den hTemplateFile-Parameter .
  • Legt das vom bInheritHandle-Member des lpSecurityAttributes-Parameters (SECURITY_ATTRIBUTES-Struktur ) angegebene Vererbungsflag fest, sofern angegeben, ignoriert jedoch den lpSecurityDescriptor-Member der SECURITY_ATTRIBUTES-Struktur .

Dateiattribute und Verzeichnisse

Dateiattribute sind Teil der Metadaten, die einer Datei oder einem Verzeichnis zugeordnet sind, und haben jeweils einen eigenen Zweck und Regeln, wie sie festgelegt und geändert werden können. Einige dieser Attribute gelten nur für Dateien, andere nur für Verzeichnisse. Beispielsweise gilt das Attribut FILE_ATTRIBUTE_DIRECTORY nur für Verzeichnisse: Es wird vom Dateisystem verwendet, um zu bestimmen, ob ein Objekt auf dem Datenträger ein Verzeichnis ist, aber es kann nicht für ein vorhandenes Dateisystemobjekt geändert werden.

Einige Dateiattribute können für ein Verzeichnis festgelegt werden, haben jedoch nur Bedeutung für Dateien, die in diesem Verzeichnis erstellt wurden und als Standardattribute fungieren. Beispielsweise kann FILE_ATTRIBUTE_COMPRESSED für ein Verzeichnisobjekt festgelegt werden, aber da das Verzeichnisobjekt selbst keine tatsächlichen Daten enthält, ist es nicht wirklich komprimiert. Verzeichnisse, die mit diesem Attribut gekennzeichnet sind, weisen das Dateisystem jedoch an, alle neuen Dateien zu komprimieren, die diesem Verzeichnis hinzugefügt werden. Jedes Dateiattribute, das für ein Verzeichnis festgelegt werden kann und auch für neue Dateien festgelegt wird, die diesem Verzeichnis hinzugefügt werden, wird als geerbtes Attribut bezeichnet.

Die CreateFile-Funktion stellt einen Parameter zum Festlegen bestimmter Dateiattribute bereit, wenn eine Datei erstellt wird. Im Allgemeinen sind diese Attribute für eine Anwendung am häufigsten zum Zeitpunkt der Dateierstellung zu verwenden, aber nicht alle möglichen Dateiattribute sind für CreateFile verfügbar. Einige Dateiattribute erfordern die Verwendung anderer Funktionen, z. B. SetFileAttributes, DeviceIoControl oder DecryptFile , nachdem die Datei bereits vorhanden ist. Im Fall von FILE_ATTRIBUTE_DIRECTORY ist die CreateDirectory-Funktion zum Zeitpunkt der Erstellung erforderlich, da CreateFile keine Verzeichnisse erstellen kann. Die anderen Dateiattribute, die eine spezielle Behandlung erfordern, sind FILE_ATTRIBUTE_REPARSE_POINT und FILE_ATTRIBUTE_SPARSE_FILE, die DeviceIoControl erfordern. Weitere Informationen finden Sie unter SetFileAttributes.

Wie bereits erwähnt, tritt die Vererbung von Dateiattributen auf, wenn eine Datei mit Dateiattributen erstellt wird, die aus den Verzeichnisattributen gelesen werden, in denen sich die Datei befindet. In der folgenden Tabelle sind diese geerbten Attribute und deren Beziehung zu CreateFile-Funktionen zusammengefasst.

Verzeichnisattributestatus CreateFile-Vererbungsüberschreibungsfunktion für neue Dateien
FILE_ATTRIBUTE_COMPRESSED festgelegt.
Kein Steuerelement. Verwenden Sie DeviceIoControl zum Löschen.
FILE_ATTRIBUTE_COMPRESSED nicht festgelegt.
Kein Steuerelement. Verwenden Sie DeviceIoControl zum Festlegen.
FILE_ATTRIBUTE_ENCRYPTED festgelegt.
Kein Steuerelement. Verwenden Sie DecryptFile.
FILE_ATTRIBUTE_ENCRYPTED nicht festgelegt.
Kann mit CreateFile festgelegt werden.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED festgelegt.
Kein Steuerelement. Verwenden Sie SetFileAttributes zum Löschen.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED nicht festgelegt.
Kein Steuerelement. Verwenden Sie SetFileAttributes zum Festlegen.

Zugriffssteuerung

CreateFile

Deviceiocontrol

Dateiattributekonstanten

Dateikomprimierung und Dekomprimierung

Dateiverschlüsselung

Dateiverwaltungsfunktionen

Handles und Objekte

Behandeln der Vererbung

Öffnen einer Datei zum Lesen oder Schreiben

SetFileAttributes