巨大なファイル(スパースファイル)を作成する【Windows API】

スパースファイルを作成する例です。 巨大なファイルサイズのファイルを作成してもディスクの消費量はほんの数KBで済みます。TBクラスのファイルも平気です。 DeviceIoControlでFSCTL_SET_SPARSEを設定しなかった場合は普通に指定サイズのファイルを作成します。 Windows2000以降でしか使用することができないので注意してください。

#define _WIN32_WINNT    0x0500
#include    <winioctl.h>

int main(int argc, char* argv[])
{
    HANDLE hFile;
    DWORD dwBytesReturned;

    hFile = CreateFile("C:\\TEST.DATA", GENERIC_WRITE,
                       0, NULL, CREATE_ALWAYS, 0, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        printf("ファイルが作成できませんでした。\n");
        return 1;
    }

    if (DeviceIoControl(hFile, FSCTL_SET_SPARSE, NULL,
             0, NULL, 0, &dwBytesReturned, NULL)) {

        // 1GBのファイルを作成する場合の例
        SetFilePointer(hFile, 1024*1024*1024, NULL, FILE_BEGIN);

        // 32GBのファイルを作成する場合の例
        //LONG lDist = 8;
        //SetFilePointer(hFile, 0, &lDist, FILE_BEGIN);

        SetEndOfFile(hFile);
        CloseHandle(hFile);

    } else {
        printf("書き込み処理が失敗しました。 (%d)\n",
         GetLastError());
    }

    CloseHandle(hFile);
    return 0;
}

 

Windows API

Posted by @erestage