[HCPC] Win32 > IO > SetFileSize

// Win32で任意サイズのファイルを作る Ver.2008.3.8
// Copyright (C) 2008 T.Hirase, All rights reserved.
//-----------------------------------------------------
#include <windows.h>

int main()
{
    // 変数宣言
    HANDLE         fileHandle   = INVALID_HANDLE_VALUE;   // ファイルアクセス用のハンドル
    const LONGLONG fileSize     = (LONGLONG)1024 * 1024 * 1024 * 8; // ファイルサイズ
    LONG           fileSizeHigh = (fileSize & 0xffffffff00000000) >> 32; // 上位32bit
    const LONG     fileSizeLow  = (fileSize << 32) >> 32; // 下位32bit

    // ファイルを開く(ファイルへのハンドル取得)
    fileHandle = CreateFileW(
        L"Your file path.",    // ファイルのパス
        GENERIC_WRITE,         // 書き込みモードで開く。
        FILE_SHARE_READ,       // 排他処理の設定。読み取りモードでは、他プロセスも読める。
        NULL,
        CREATE_ALWAYS,         // いつも新規作成。(すでにファイルが存在する場合は、ファイルサイズが0になる。)
        FILE_ATTRIBUTE_NORMAL, // 特別なモードの設定。特になし。
        NULL);

    // エラーチェック
    if (fileHandle == INVALID_HANDLE_VALUE)
    {
        DWORD invalidReason = GetLastError();
        DebugBreak();
    }

    // ファイルポインタを指定位置まで移動させる。
    DWORD dwRet = SetFilePointer(fileHandle, fileSizeLow, &fileSizeHigh, FILE_BEGIN);
    if (dwRet == INVALID_SET_FILE_POINTER)
    {
        DWORD invalidReason = GetLastError();
        if (invalidReason == ERROR_DISK_FULL) {
            // ディスクに十分な空き容量がありません。
        }
        DebugBreak();
    }

    // 現在のファイルポインタ位置をファイルの終端に設定する。
    // これで任意サイズのファイルを作られる。
    BOOL bRet = SetEndOfFile(fileHandle);
    if (!bRet)
    {
        DWORD invalidReason = GetLastError();
        DebugBreak();
    }
    // ハンドル解放
    CloseHandle(fileHandle);

    return 0;
}

更新履歴

2008.03.08
4GB以上のファイル作成に対応
2008.02.21
(初)