Erstellen und Öffnen von Dateien

Die CreateFile-Funktion kann eine neue Datei erstellen oder eine vorhandene Datei öffnen. Sie müssen den Dateinamen, 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 die Datei lesen, in diese 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 vom 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 versucht wird, das Handle für den Zugriff auf die Datei zu verwenden. Wenn ein Fehler auftritt, ist 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 möchte, sowohl Lese- als auch Schreibzugriff oder keines von beiden. Dies wird als Anfordern eines Zugriffsmodus bezeichnet. Die Anwendung muss auch den dwCreationDisposition-Parameter verwenden, um anzugeben, welche Aktion zu ergreifen ist, wenn die Datei bereits vorhanden ist. Dies wird als Erstellungsdisposition bezeichnet. Beispielsweise kann eine Anwendung CreateFile aufrufen, bei der 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 überschreiben wird). Ob dies erfolgreich ist, 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 die Datei zum Lesen, Schreiben, beides oder keines von beiden gemeinsam verwendet werden soll. Dies wird als Freigabemodus bezeichnet. Eine nicht freigegebene geöffnete Datei (dwShareMode auf 0 festgelegt) kann nicht erneut geöffnet werden, weder von der Anwendung, die sie geöffnet hat, noch von einer anderen Anwendung, 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 im Freigabemodus geöffnet wurde (dwShareMode ist auf einen gültigen Wert ungleich 0 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 steht, schlägt CreateFile fehl.

Die folgende Tabelle veranschaulicht die gültigen Kombinationen von zwei Aufrufen von CreateFile mit verschiedenen Zugriffsmodi und Freigabemodi (dwDesiredAccess bzw. dwShareMode). Es spielt keine Rolle, in welcher Reihenfolge die CreateFile-Aufrufe vorgenommen werden. Alle nachfolgenden Datei-E/A-Vorgänge für jedes Dateihand handle werden jedoch weiterhin durch die aktuellen Zugriffs- und Freigabemodi eingeschränkt, die diesem bestimmten Dateihand handle zugeordnet sind.

Erster Aufruf von CreateFile Gültige zweite Aufrufe von 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_READ
FILE_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_READ
  • GENERIC_WRITE, FILE_SHARE_READ
  • GENERIC_READ
  • GENERIC_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 angeben. Das zugrunde liegende Dateisystem muss jedoch die Sicherheit unterstützen, damit dies auswirkungen hat (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 angeben, aus der CreateFile Dateiattribute und erweiterte Attribute für die Erstellung der neuen Datei verwendet.

    CreateFile-Szenarien

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

    • Erstellen einer neuen Datei, wenn eine Datei mit diesem Namen noch nicht vorhanden ist.
    • Erstellen einer neuen Datei, auch wenn bereits eine Datei mit demselben Namen vorhanden ist, löschen Sie ihre Daten, und beginnen Sie leer.
    • Öffnen einer vorhandenen Datei nur, wenn sie vorhanden und nur intakt ist.
    • Öffnen Sie eine vorhandene Datei nur, wenn sie vorhanden ist, und schneiden Sie sie so ab, dass sie leer ist.
    • Öffnen einer Datei immer: wie vorhanden, wenn sie vorhanden ist, 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 Aufschlüsselung der Zuordnung dieser Szenarien zu Werten für diesen Parameter und deren Verwendung.

    Beim Erstellen oder Öffnen einer neuen Datei, wenn noch keine Datei mit diesem Namen 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 Parameter hTemplateFile angegeben ist (dadurch werden alle zuvor angegebenen FILE _ _ * ATTRIBUTE-Flags überschrieben).
    • Legt das vom bInheritHandle-Member angegebene Erbenflag und den Sicherheitsdeskriptor fest, der vom lpSecurityDescriptor-Member 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 die aktuellen Dateiattribute und Sicherheitseinstellungen auf Schreibzugriff und führt zu einem Fehler, wenn der Zugriff verweigert wird.
    • Kombiniert die von dwFlagsAndAttributes angegebenen Dateiattribute und Flags mit FILE ATTRIBUTE _ _ ARCHIVE und den vorhandenen Dateiattributen.
    • Legt die Dateilänge auf 0 (null) fest (d. h., alle Daten in der Datei 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 Parameter hTemplateFile angegeben ist (dadurch werden alle zuvor angegebenen FILE _ _ * ATTRIBUTE-Flags überschrieben).
    • Legt das erben-Flag fest, das vom bInheritHandle-Member des lpSecurityAttributes-Parameters (SECURITY _ ATTRIBUTES-Struktur) angegeben wird, sofern angegeben, ignoriert jedoch den lpSecurityDescriptor-Member der SECURITY _ ATTRIBUTES-Struktur.
    • Wenn dies andernfalls erfolgreich ist (d. h., CreateFile gibt ein gültiges Handle zurück), gibt der Aufruf von GetLastError den Code ERROR ALREADY _ _ EXISTS zurück, obwohl es sich für diesen speziellen Verwendungsfall eigentlich nicht um einen Fehler als solchen handelt (wenn Sie eine "neue" (leere) Datei statt der vorhandenen erstellen möchten).

    Beim Öffnen einer vorhandenen Datei (dwCreationDisposition entweder 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 und führt zu einem Fehler, wenn der Zugriff verweigert wird.
    • Kombiniert die von _dwFlagsAndAttributes* angegebenen Dateiflags (FILE _ FLAG _ * _) mit vorhandenen Dateiattributen _ _ * und ignoriert alle Dateiattribute (*FILE ATTRIBUTE _), die von _dwFlagsAndAttributes angegeben werden.
    • Legt die Dateilänge nur dann auf 0 (null) fest, wenn dwCreationDisposition auf TRUNCATE _ EXISTING festgelegt ist. Andernfalls wird die aktuelle Dateilänge beibehalten, und die Datei wird im vorliegenden Zustand geöffnet.
    • Ignoriert den hTemplateFile-Parameter.
    • Legt das erben-Flag fest, das vom bInheritHandle-Member des lpSecurityAttributes-Parameters (SECURITY _ ATTRIBUTES-Struktur) angegeben wird, 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, die jeweils einen eigenen Zweck haben und regeln, wie sie festgelegt und geändert werden können. Einige dieser Attribute gelten nur für Dateien und andere nur für Verzeichnisse. Das FILE _ ATTRIBUTE _ DIRECTORY-Attribut gilt beispielsweise nur für Verzeichnisse: Es wird vom Dateisystem verwendet, um zu bestimmen, ob ein Objekt auf dem Datenträger ein Verzeichnis ist, es kann jedoch nicht für ein vorhandenes Dateisystemobjekt geändert werden.

    Einige Dateiattribute können für ein Verzeichnis festgelegt werden, haben jedoch nur für Dateien, die in diesem Verzeichnis erstellt wurden und als Standardattribute verwendet werden. Beispielsweise kann FILE _ ATTRIBUTE _ COMPRESSED für ein Verzeichnisobjekt festgelegt werden, aber da das Verzeichnisobjekt selbst keine tatsächlichen Daten enthält, wird es nicht wirklich komprimiert. Verzeichnisse, die mit diesem Attribut gekennzeichnet sind, teilen dem Dateisystem jedoch mit, alle neuen Dateien zu komprimieren, die diesem Verzeichnis hinzugefügt wurden. Jedes Dateiattribut, 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 bietet einen Parameter zum Festlegen bestimmter Dateiattribute, wenn eine Datei erstellt wird. Im Allgemeinen werden diese Attribute am häufigsten von einer Anwendung zum Zeitpunkt der Dateierstellung verwendet, aber nicht alle möglichen Dateiattribute sind für CreateFile verfügbar. Einige Dateiattribute erfordern die Verwendung anderer Funktionen, z. B. SetFileAttributes, DeviceIoControloder 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 besondere Behandlung erfordern, sind FILE _ ATTRIBUTE _ REPARSE _ POINT und FILE ATTRIBUTE _ _ SPARSE _ FILE, für die DeviceIoControl erforderlich ist. 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 werden diese geerbten Attribute und ihre Beziehung zu CreateFile-Funktionen zusammengefasst.

    Verzeichnisattributstatus CreateFile-Vererbungsüberschreibungsfunktion für neue Dateien
    FILE _ ATTRIBUTE _ COMPRESSED set.
    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 ist nicht festgelegt.
    Kann mit CreateFile festgelegt werden.
    FILE _ ATTRIBUTE _ NOT _ CONTENT _ INDEXED set.
    Kein Steuerelement. Verwenden Sie SetFileAttributes zum Löschen.
    FILE _ ATTRIBUTE _ NOT _ CONTENT _ INDEXED nicht festgelegt.
    Kein Steuerelement. Legen Sie setFileAttributes fest.

    Zugriffssteuerung

    CreateFile

    Deviceiocontrol

    Dateiattributkonst constants

    Dateikomprimierung und Dekomprimierung

    Dateiverschlüsselung

    Dateiverwaltungsfunktionen

    Handles und Objekte

    Behandeln der Vererbung

    Öffnen einer Datei zum Lesen oder Schreiben

    SetFileAttributes