Share via


Erstellen eines Dateizuordnungsobjekts

Der erste Schritt beim Zuordnen einer Datei besteht darin, die Datei durch Aufrufen der CreateFile-Funktion zu öffnen. Um sicherzustellen, dass andere Prozesse nicht in den zugeordneten Teil der Datei schreiben können, sollten Sie die Datei mit exklusivem Zugriff öffnen. Darüber hinaus sollte das Dateihandle geöffnet bleiben, bis der Prozess das Dateizuordnungsobjekt nicht mehr benötigt. Eine einfache Möglichkeit, exklusiven Zugriff zu erhalten, besteht darin, null im fdwShareMode-Parameter von CreateFile anzugeben. Das von CreateFile zurückgegebene Handle wird von der CreateFileMapping-Funktion verwendet, um ein Dateizuordnungsobjekt zu erstellen.

Die CreateFileMapping-Funktion gibt ein Handle an das Dateizuordnungsobjekt zurück. Dieses Handle wird beim Erstellen einer Dateiansicht verwendet, damit Sie auf den freigegebenen Arbeitsspeicher zugreifen können. Wenn Sie CreateFileMapping aufrufen, geben Sie einen Objektnamen, die Anzahl der Bytes an, die aus der Datei zugeordnet werden sollen, und die Lese-/Schreibberechtigung für den zugeordneten Arbeitsspeicher. Der erste Prozess, der CreateFileMapping aufruft , erstellt das Dateizuordnungsobjekt. Prozesse, die CreateFileMapping für ein vorhandenes Objekt aufrufen, erhalten ein Handle für das vorhandene Objekt. Sie können feststellen, ob ein erfolgreicher Aufruf von CreateFileMapping das Dateizuordnungsobjekt erstellt oder geöffnet hat, indem Sie die GetLastError-Funktion aufrufen. GetLastError gibt NO_ERROR zum Erstellungsprozess und ERROR_ALREADY_EXISTS zu nachfolgenden Prozessen zurück.

Die CreateFileMapping-Funktion schlägt fehl, wenn die Zugriffsflags mit denen in Konflikt treten, die beim Öffnen der Datei durch die CreateFile-Funktion angegeben wurden. So können Sie beispielsweise lesen und in die Datei schreiben:

  • Geben Sie die werte GENERIC_READ und GENERIC_WRITE im fdwAccess-Parameter von CreateFile an.
  • Geben Sie den wert PAGE_READWRITE im fdwProtect-Parameter von CreateFileMapping an.

Beim Erstellen eines Dateizuordnungsobjekts wird kein Commit für physischen Arbeitsspeicher ausgeführt, es wird nur reserviert.

Dateizuordnungsgröße

Die Größe des Dateizuordnungsobjekts ist unabhängig von der Größe der zugeordneten Datei. Wenn das Dateizuordnungsobjekt jedoch größer als die Datei ist, erweitert das System die Datei, bevor CreateFileMapping zurückgibt. Wenn das Dateizuordnungsobjekt kleiner als die Datei ist, ordnet das System nur die angegebene Anzahl von Bytes aus der Datei zu.

Mit den Parametern dwMaximumSizeHigh und dwMaximumSizeLow von CreateFileMapping können Sie die Anzahl der Bytes angeben, die aus der Datei zugeordnet werden sollen:

  • Wenn sich die Größe der Datei nicht ändern soll (z. B. beim Zuordnen schreibgeschützter Dateien), rufen Sie CreateFileMapping auf, und geben Sie null für dwMaximumSizeHigh und dwMaximumSizeLow an. Dadurch wird ein Dateizuordnungsobjekt erstellt, das genau die gleiche Größe wie die Datei hat. Andernfalls müssen Sie die Größe der fertigen Datei berechnen oder schätzen, da Dateizuordnungsobjekte statisch sind. nach der Erstellung kann ihre Größe nicht erhöht oder verringert werden. Ein Versuch, eine Datei mit einer Länge von 0 auf diese Weise zuzuordnen, schlägt mit dem Fehlercode ERROR_FILE_INVALID fehl. Programme sollten auf Dateien mit einer Länge von 0 testen und solche Dateien ablehnen.

  • Die Größe eines Dateizuordnungsobjekts, das von einer benannten Datei unterstützt wird, wird durch Speicherplatz begrenzt. Die Größe einer Dateiansicht ist auf den größten verfügbaren zusammenhängenden Block des nicht reservierten virtuellen Arbeitsspeichers beschränkt. Dies sind höchstens 2 GB abzüglich des bereits vom Prozess reservierten virtuellen Arbeitsspeichers.

Die Größe des dateizuordnungsobjekts, das Sie auswählen, steuert, wie weit sie mit der Speicherzuordnung in die Datei "sehen" können. Wenn Sie ein Dateizuordnungsobjekt mit einer Größe von 500 KB erstellen, haben Sie unabhängig von der Größe der Datei nur Zugriff auf die ersten 500 KB der Datei. Da es ihnen keine Systemressourcen kostet, ein größeres Dateizuordnungsobjekt zu erstellen, erstellen Sie ein Dateizuordnungsobjekt, das der Größe der Datei entspricht (legen Sie die Parameter dwMaximumSizeHigh und dwMaximumSizeLow von CreateFileMapping beide auf Null fest), auch wenn Sie nicht erwarten, dass die gesamte Datei angezeigt wird. Die Kosten für Systemressourcen entstehen durch das Erstellen der Ansichten und den Zugriff darauf.

Sie können einen Teil der Datei anzeigen, der nicht am Anfang der Datei beginnt. Weitere Informationen finden Sie unter Erstellen einer Ansicht in einer Datei.

Erstellen einer Dateiansicht

Erstellen einer Ansicht in einer Datei