我正在看一本名為“windows via c/c ”的書。它說程式員可以VirtualAlloc()使用FileMapping.
我可以看到這個稀疏檔案在書中的檔案屬性中占用了 1MB。
書上說它實際上只需要 64KB 的磁盤空間。
那么如何獲得稀疏檔案的實際大小呢?此外,我創建了一個備用檔案,其代碼如下:
#include <iostream>
#include <Windows.h>
int main()
{
using namespace std;
HANDLE fileHandle = CreateFile(TEXT("D:\\sfile.txt"), GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
if(fileHandle==INVALID_HANDLE_VALUE)
{
cout << "INVALID FILE HANDLE" << endl;
return 1;
}
HANDLE hFileMapping = CreateFileMapping(fileHandle, nullptr, PAGE_READWRITE|SEC_RESERVE, 0, 4*1024 * 1024, nullptr);
if(hFileMapping==INVALID_HANDLE_VALUE||hFileMapping==NULL)
{
cout << "INVALID FILE MAPPING HANDLE" << endl;
return 1;
}
PVOID view = MapViewOfFile(hFileMapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024 * 1024);
if(view == nullptr)
{
cout << "map failed" << endl;
return 1;
}
PVOID revisePos = static_cast<PLONG_PTR>(view) 512;
auto allocatePos = (char*)VirtualAlloc(revisePos, 1024 * 1024, MEM_COMMIT, PAGE_READWRITE);
char mess[] = "123456789 hello world!";
strcpy_s(static_cast<char*>(revisePos), sizeof(mess), mess);
UnmapViewOfFile(view);
CloseHandle(hFileMapping);
CloseHandle(fileHandle);
}
它將創建 4MB 檔案,雖然我只是嘗試VirtualAlloc1MB 。通過觀察檔案的屬性,這個檔案似乎在 Windows 上實際占用了 4MB。
為什么視窗不會壓縮稀疏檔案?如果windows不會壓縮它,我什么時候需要一個稀疏檔案。

uj5u.com熱心網友回復:
你應該檢查檔案而不是依賴這本書。
PAGE_READWRITE|SEC_RESERVE您創建一個由帶有選項的普通檔案支持的檔案映射。
檔案大小應該增加 4 MB 以匹配映射物件的大小:
如果應用程式為檔案映射物件指定的大小大于磁盤上實際命名檔案的大小,并且如果頁面保護允許寫訪問(即 flProtect 引數指定
PAGE_READWRITEorPAGE_EXECUTE_READWRITE),則磁盤上的檔案會增加以匹配檔案映射物件的指定大小。
SEC_RESERVE完全沒有效果:
此屬性對由可執行影像檔案或資料檔案支持的檔案映射物件沒有影響(hfile 引數是檔案句柄)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483263.html
上一篇:如何將Control-A作為熱鍵添加到對話框中的所有EDITTEXT控制元件?
下一篇:GDI:創建山圖/圖形?
