在 Windows 中建立檔案對應物件牽涉到 CreateFile 函式開啟檔案。 此過程可讓您將檔案內容直接映射到記憶體中,以便進行高效存取和操作。 若要確保其他進程無法寫入對應的檔案部分,您應該以獨佔存取權開啟檔案。 此外,檔案句柄應該保持開啟狀態,直到進程不再需要檔案對應物件為止。 取得獨佔存取權的簡單方法是在 createFile 的 fdwShareMode參數中指定零。 CreateFile 傳回的控制碼會由 CreateFileMapping 函式用來建立檔案對應物件。
CreateFileMapping 函式會傳回檔案對應物件的控制碼。 在 建立檔案檢視 時,將使用此句柄,以便存取共用記憶體。 當您呼叫 CreateFileMapping時,您可以指定物件名稱、要從檔案對應的位元元數目,以及對應記憶體的讀取/寫入許可權。 呼叫 CreateFileMapping 的第一個程式 會建立檔案對應物件。 針對現有物件呼叫 CreateFileMapping 的程序會收到該現有物件的句柄。 您可以呼叫 GetLastError 函式,判斷成功呼叫 CreateFileMapping 是否建立或開啟檔案對應物件。 GetLastError 傳回 NO_ERROR 給建立程序,並將 ERROR_ALREADY_EXISTS 傳送給後續進程。
如果存取旗標與 CreateFile 函式開啟檔案時指定的旗標衝突,則 CreateFileMapping 函式會失敗。 例如,若要讀取和寫入檔案:
- 在 CreateFile 的 fdwAccess 參數中指定GENERIC_READ和GENERIC_WRITE值。
- 在 CreateFileMapping 的 fdwProtect 參數中指定PAGE_READWRITE值。
建立檔案對應物件不會分配物理記憶體,只會預留它。
檔案映射大小
檔案對應物件的大小與所對應的檔案大小無關。 不過,如果檔案對應物件大於檔案,系統會在 CreateFileMapping 傳回之前展開檔案。 如果檔案對應物件小於檔案,系統只會對應檔案中的指定位元元組數目。
CreateFileMapping 的 dwMaximumSizeHigh 和 dwMaximumSizeLow 參數可讓您指定要從檔案對應的位元組數目:
當您不想變更檔案的大小,例如在對應唯讀檔案時,請呼叫 CreateFileMapping,並為 dwMaximumSizeHigh 和 dwMaximumSizeLow 指定零。 這樣做會建立與檔案完全相同大小的檔案對應物件。 否則,您必須計算或估計完成檔案的大小,因為檔案對應物件的大小是靜態的;建立之後,就無法增加或減少其大小。 嘗試以這種方式對應長度為零的檔案失敗,錯誤碼為 ERROR_FILE_INVALID。 程式應該測試長度為零的檔案,並拒絕這類檔案。
由具名檔案支持的檔案對應物件大小受限於磁碟空間。 檔案檢視的大小僅限於未保留虛擬記憶體的最大可用連續區塊。
您選取的檔案對應物件大小會控制記憶體對應時您能訪問檔案內容的範圍。 如果您建立大小為 500 Kb 的檔案對應物件,則不論檔案大小為何,您只能存取檔案的前 500 Kb。 由於建立較大的檔案對應物件不會花費任何系統資源,因此請建立檔案大小的檔案對應物件 (將 CreateFileMapping 的 dwMaximumSizeHigh 和 dwMaximumSizeLow 參數設定為零) ,即使您不預期檢視整個檔案也一樣。 系統資源的消耗來自於建立和存取檢視。
您可以檢視檔案中不從開頭開始的部分。 如需詳細資訊,請參閱 在檔案中建立檢視。
相關內容
在檔案 內建立檢視