從檔案檢視讀取和寫入
若要從檔案檢視讀取,請取值 MapViewOfFile 函式所傳回的指標,如下列範例所示。
讀取或寫入頁面檔案以外的檔案檢視可能會導致 EXCEPTION_IN_PAGE_ERROR 例外狀況。 例如,如果與伺服器的連線遺失,存取位於遠端伺服器上的對應檔案可能會產生例外狀況。 也可能因為完整磁片、基礎裝置失敗或記憶體配置失敗而發生例外狀況。 為了防範因為輸入和輸出 (I/O) 錯誤而發生的例外狀況,所有嘗試存取記憶體對應檔案都應該包裝在結構化例外狀況處理常式中。 當您在__except篩選中收到EXCEPTION_IN_PAGE_ERROR時,請確定位址位於您目前正在存取的對應中。 如果是,請正常復原或失敗;否則,請勿處理例外狀況。
下列範例會使用 MapViewOfFile 傳回的指標從檔案檢視讀取:
DWORD dwLength;
__try
{
dwLength = *((LPDWORD) lpMapAddress);
}
__except(GetExceptionCode()==EXCEPTION_IN_PAGE_ERROR ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// Failed to read from the view.
}
下列範例會使用 MapViewOfFile 傳回的指標來寫入檔案檢視:
DWORD dwLength;
__try
{
*((LPDWORD) lpMapAddress) = dwLength;
}
__except (GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// Failed to write to the view.
}
FlushViewOfFile函式會將檔案檢視的指定位元組數目複製到實體檔案,而不需要等待快取的寫入作業發生:
if (!FlushViewOfFile(lpMapAddress, dwBytesToFlush))
{
printf("Could not flush memory to disk (%d).\n", GetLastError());
}
如果您要在 NTFS 分割區上對應壓縮或疏鬆檔案,在檔案的一部分分頁時,可能會發生額外的 I/O 錯誤。 在此情況下, MapViewOfFile 所對應的位址空間可能不受配置的磁碟空間支援。 這是因為疏鬆檔案可以有零的區域,其中 NTFS 不會配置磁碟空間,而壓縮的檔案可能會佔用比它所代表的實際資料較少的磁碟空間。 如果您讀取或寫入未受磁碟空間支援之疏鬆或壓縮檔案的一部分,作業系統可能會嘗試配置磁碟空間。 如果磁片已滿,這可能會導致指出 I/O 錯誤的例外狀況。
相關主題