Membaca dan Menulis Dari Tampilan File

Untuk membaca dari tampilan file, dereferensi penunjuk yang dikembalikan oleh fungsi MapViewOfFile seperti yang ditunjukkan pada contoh di bawah ini.

Membaca dari atau menulis ke tampilan file selain file halaman dapat menyebabkan pengecualian EXCEPTION_IN_PAGE_ERROR . Misalnya, mengakses file yang dipetakan yang berada di server jarak jauh dapat menghasilkan pengecualian jika koneksi ke server hilang. Pengecualian juga dapat terjadi karena disk penuh, kegagalan perangkat yang mendasar, atau kegagalan alokasi memori. Untuk melindungi dari pengecualian karena kesalahan input dan output (I/O), semua upaya untuk mengakses file yang dipetakan memori harus dibungkus dalam penangan pengecualian terstruktur. Saat Anda menerima EXCEPTION_IN_PAGE_ERROR di filter __except Anda, pastikan alamat berada dalam pemetaan yang saat ini Anda akses. Jika demikian, pulihkan atau gagal dengan baik; jika tidak, jangan tangani pengecualian.

Contoh berikut menggunakan penunjuk yang dikembalikan oleh MapViewOfFile untuk membaca dari tampilan file:

  DWORD dwLength;

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

Contoh berikut menggunakan penunjuk yang dikembalikan oleh MapViewOfFile untuk menulis ke tampilan file:

  DWORD dwLength;

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

Fungsi FlushViewOfFile menyalin jumlah byte yang ditentukan dari tampilan file ke file fisik, tanpa menunggu operasi penulisan yang di-cache terjadi:

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

Jika Anda memetakan file terkompresi atau jarang pada partisi NTFS, ada potensi tambahan untuk kesalahan I/O saat membuat halaman dalam sebagian file. Dalam hal ini, ruang alamat yang dipetakan oleh MapViewOfFile mungkin tidak didukung oleh ruang disk yang dialokasikan. Ini karena file jarang dapat memiliki wilayah nol di mana NTFS tidak mengalokasikan ruang disk, dan file terkompresi dapat memakan lebih sedikit ruang disk daripada data aktual yang diwakilinya. Jika Anda membaca dari atau menulis ke sebagian file jarang atau terkompresi yang tidak didukung oleh ruang disk, sistem operasi dapat mencoba mengalokasikan ruang disk. Jika disk penuh, ini dapat mengakibatkan pengecualian yang menunjukkan kesalahan I/O.

Penanganan Pengecualian Terstruktur