簡體   English   中英

如何在 Windows 上獲取稀疏文件的真實磁盤使用情況?

[英]How to get the true disk usage of a sparse file on windows?

我正在看一本名為“windows via c/c++”的書。 它說程序員可以在FileMapping上使用VirtualAlloc()創建一個稀疏文件。

我可以看到這個稀疏文件在書中的文件屬性中占用了 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 文件,盡管我只是嘗試使用VirtualAlloc 1MB 。 通過觀察文件的屬性,這個文件似乎在 Windows 上實際占用了 4MB。
文件的屬性
為什么窗口不會壓縮稀疏文件? 如果windows不會壓縮它,我什么時候需要一個稀疏文件。

你應該檢查文檔而不是依賴這本書。

您可以使用PAGE_READWRITE|SEC_RESERVE選項創建由普通文件支持的文件映射。

文件大小應該增加 4 MB 以匹配映射對象的大小:

如果應用程序為文件映射對象指定的大小大於磁盤上實際命名文件的大小,並且如果頁面保護允許寫訪問(即 flProtect 參數指定PAGE_READWRITEPAGE_EXECUTE_READWRITE ),則磁盤上的文件增加以匹配文件映射對象的指定大小。

SEC_RESERVE完全沒有效果:

此屬性對由可執行圖像文件或數據文件支持的文件映射對象沒有影響(hfile 參數是文件句柄)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM