ファイルのサイズを取得する方法【Windows API】

ファイル名からファイルサイズを取得したい場合に使用します。残念ながら「GetFileSize」関数ではファイルハンドルからファイルサイズを取得する仕様になっていますので、ファイルパスを与えるとファイルサイズを返してくれる関数を作ってみます。4GBを超えるファイルは扱いが異なってきますので別関数にしてあります。 最初から巨大なファイルを相手にしていないアプリケーションの場合は最初の関数を使用しても大丈夫です。

// ファイルサイズの取得 (4GB超対応版)
//
// [引数]
// fname : ファイル名
//
// [返値]
// 正常に終了した場合 : TRUE
// ファイル未検出 : FALSE

BOOL GetLargeFileSize(char *fname, __int64 &nFileSize)
{
    DWORD dwFileSizeLow, dwFileSizeHigh;
    HANDLE hFile;

    hFile = CreateFile(    fname, GENERIC_READ, 0, NULL, 
                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    // ファイルが開けなかった場合
    if (hFile == INVALID_HANDLE_VALUE) return FALSE;

    dwFileSizeLow = GetFileSize(hFile,&dwFileSizeHigh);
    nFileSize = ((__int64)dwFileSizeHigh << 32) + dwFileSizeLow;

    CloseHandle(hFile);

    if (dwFileSizeLow == -1 && (GetLastError() != NO_ERROR)) {
        return FALSE;
    }

    return TRUE;
}
// ファイルサイズの取得 (通常版)
//
// [引数]
// fname : ファイル名
//
// [返値]
// 正常に終了した場合 : TRUE
// ファイル未検出 : FALSE

BOOL GetShortFileSize(char *fname, DWORD &dwFileSize)
{
    HANDLE hFile;

    hFile = CreateFile(    fname, GENERIC_READ, 0, NULL, 
                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    // ファイルが開けなかった場合
    if (hFile == INVALID_HANDLE_VALUE) return FALSE;

    dwFileSize = GetFileSize(hFile, NULL);
    CloseHandle(hFile);

    if (dwFileSize == -1 && (GetLastError() != NO_ERROR)) {
        return FALSE;
    }

    return TRUE;
}
__int64 nFileSize;
if (GetLargeFileSize("D:\\TEST.TXT", nFileSize)) {
    printf("FileSize: %Ld[byte]\n", nFileSize);
}

DWORD dwFileSize;
if (GetShortFileSize("D:\\TEST.TXT", dwFileSize)) {
    printf("FileSize: %d[byte]\n", dwFileSize);
}

 

Windows API

Posted by @erestage