Lesen und Schreiben aus einer Dateiansicht

Um aus einer Dateiansicht zu lesen, leiten Sie den von der MapViewOfFile-Funktion zurückgegebenen Zeiger ab, wie in den folgenden Beispielen gezeigt.

Das Lesen oder Schreiben in eine Dateiansicht einer anderen Datei als der Auslagerungsdatei kann zu einer EXCEPTION_IN_PAGE_ERROR Ausnahme führen. Der Zugriff auf eine zugeordnete Datei, die sich auf einem Remoteserver befindet, kann beispielsweise eine Ausnahme generieren, wenn die Verbindung mit dem Server unterbrochen wird. Ausnahmen können auch aufgrund eines vollständigen Datenträgers, eines zugrunde liegenden Gerätefehlers oder eines Speicherbelegungsfehlers auftreten. Zum Schutz vor Ausnahmen aufgrund von Eingabe- und Ausgabefehlern (E/A) sollten alle Versuche, auf Speicher zugeordnete Dateien zuzugreifen, in strukturierte Ausnahmehandler umschlossen werden. Wenn Sie EXCEPTION_IN_PAGE_ERROR in Ihrem __except-Filter erhalten, stellen Sie sicher, dass sich die Adresse innerhalb der Zuordnung befindet, auf die Sie gerade zugreifen. Wenn dies der Fall ist, stellen Sie ordnungsgemäß wiederhergestellt oder fehl. behandeln Sie andernfalls die Ausnahme nicht.

Im folgenden Beispiel wird der von MapViewOfFile zurückgegebene Zeiger verwendet, um aus der Dateiansicht zu lesen:

  DWORD dwLength;

  __try
  {
    dwLength = *((LPDWORD) lpMapAddress);
  }
  __except(GetExceptionCode()==EXCEPTION_IN_PAGE_ERROR ?
    EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
  {
    // Failed to read from the view.
  }

Im folgenden Beispiel wird der von MapViewOfFile zurückgegebene Zeiger verwendet, um in die Dateiansicht zu schreiben:

  DWORD dwLength;

  __try
  {
    *((LPDWORD) lpMapAddress) = dwLength;
  }
  __except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ? 
    EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
  {
    // Failed to write to the view.
  }

Die FlushViewOfFile-Funktion kopiert die angegebene Anzahl von Bytes der Dateiansicht in die physische Datei, ohne darauf zu warten, dass der zwischengespeicherte Schreibvorgang ausgeführt wird:

  if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush)) 
  {
    printf("Could not flush memory to disk (%d).\n", GetLastError()); 
  }

Wenn Sie eine komprimierte oder sparse-Datei auf einer NTFS-Partition zuordnen, besteht zusätzliches Potenzial für einen E/A-Fehler beim Paging in einem Teil der Datei. In diesem Fall kann der von MapViewOfFile zugeordnete Adressraum nicht durch zugewiesenen Speicherplatz gesichert werden. Dies liegt daran, dass eine Sparsedatei Bereiche mit Nullen aufweisen kann, für die NTFS keinen Speicherplatz ordnet, und eine komprimierte Datei kann weniger Speicherplatz beanspruchen als die tatsächlichen Daten, die sie darstellt. Wenn Sie aus einem Teil einer Sparse- oder komprimierten Datei lesen oder in diesen schreiben, der nicht durch Speicherplatz gesichert ist, versucht das Betriebssystem möglicherweise, Speicherplatz zuzuweisen. Wenn der Datenträger voll ist, kann dies zu einer Ausnahme führen, die auf einen E/A-Fehler hinweist.

Strukturierte Ausnahmebehandlung