Windowsコード集 上のページ

#0012 ディスク空きサイズを取得する

ディスクの空きサイズを取得します。
OSのバージョンに合わせ2GB以上のHDDに対応したGetDiskFreeSpaceExを使う事で、正しく空き容量を取得できるようになっています。

// ドライブスペース取得
DWORD GetDiskFreeSpaceMacro(LPSTR path,LPDWORD high)
{
    OSVERSIONINFO ver;
    BOOL useex = FALSE;

    ZeroMemory(&ver,sizeof(OSVERSIONINFO));
    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    if(GetVersionEx(&ver)){
        if(ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && LOWORD(ver.dwBuildNumber) > 1000){
            useex = TRUE;
        }
    }

    if(useex){
        ULARGE_INTEGER avaliable,totalbytes,freebytes;
        HINSTANCE inst = LoadLibrary("KERNEL32.DLL");
        FARPROC proc = GetProcAddress(inst,"GetDiskFreeSpaceExA");
        BOOL r = ((BOOL (WINAPI *)(LPCTSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER))proc)(path,&avaliable,&totalbytes,&freebytes);
        FreeLibrary(inst);
        if(r){
            if(high != NULL)*high = freebytes.HighPart;
            return freebytes.LowPart;
        }
    }else{
        DWORD sector_per_cluster,bytes_per_sector;
        DWORD number_of_freeclustors,total_number_of_crustors;
        if(GetDiskFreeSpace(path,§or_per_cluster,&bytes_per_sector,&number_of_freeclustors,&total_number_of_crustors)){
            DWORDLONG size = (DWORDLONG)number_of_freeclustors * (DWORDLONG)sector_per_cluster * (DWORDLONG)bytes_per_sector;
            if(high != NULL)*high = (DWORD)((size >> 32) & 0xffffffff);
            return (DWORD)(size & 0xffffffff);
        }
    }
    return 0;
}


上のページ