1. 程式人生 > >使用檔案對映檢視讀取檔案

使用檔案對映檢視讀取檔案

通常情況的檔案操作使用open、read、write,除了這種方式,還可以使用檔案對映檢視。

讀取檔案的前10個位元組:

#include <stdio.h>
#include <Windows.h>


int main()
{
	HANDLE l_hFileHandle = CreateFileA("C:\\1.pdf", GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	HANDLE l_hFileMapping = CreateFileMappingA(l_hFileHandle, NULL, PAGE_EXECUTE_READ, 0, 0, NULL);
	/* 使用32位程式在64位電腦上獲取檔案分配粒度 其他的使用GetSystemInfo() */
	SYSTEM_INFO l_SystemInfo;
	GetNativeSystemInfo(&l_SystemInfo);
	printf("%d\n",l_SystemInfo.dwAllocationGranularity);
	/* 檔案偏移高位、低位結合必須是檔案分配粒度(64K)的整數倍,實際測試均0也可以 
	   讀取檔案的前10個位元組到記憶體中,並返回起始地址值到l_pVoid變數中 */
	LPVOID l_pVoid = MapViewOfFile(l_hFileMapping, FILE_MAP_READ, 0, 0, 10);	
	DWORD l_dwError = GetLastError();	// MapViewOfFile的檔案偏移高位、地位結合必須是64K的整數倍,否則錯誤程式碼是1132
	UnmapViewOfFile(l_pVoid);
	CloseHandle(l_hFileMapping);
	CloseHandle(l_hFileHandle);

	return 0;
}

上面例子是讀取檔案內容,如果要更改檔案內容需要更改CreateFileA()的標誌為GENERIC_ALL、CreateFileMappingA()標誌為PAGE_READWRITE、MapViewOfFile()標誌為FILE_MAP_ALL_ACCESS,就是都修改為可寫。

在UnmapViewOfFile( )、CloseHandle()之後,檢視磁碟上的檔案,已經發生了變化。