Last Updated 2002/10/30
Programming Tips Visual C++ API  索 引 
GetDiskFreeSpaceEx
2002/10/30

GetDiskFreeSpaceEx を使用するには,Windows95 OSR1 と Windows95 OSR2 以降 および NT 系の区別をしなければならない.
OSR1 では GetDiskFreeSpaceEx は存在せず,GetDiskFreeSpace を使用する.

OSVERSIONINFO   OsVerInfo;

// OSの判定
OsVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVerInfo);
if( ( OsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
                (LOWORD(OsVerInfo.dwBuildNumber) > 1000) ) ||
      OsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
    // OSR2 以降,NT 系
} else {
    // OSR1
}

また,OSR1 での動作も考えると GetDiskFreeSpaceEx をそのまま使用するのではなく,動的にアドレスを取得する必要がある.
(Windows95 OSR1 ではエントリ自体が存在しないため)

ULARGE_INTEGER  ulFreeBytesAvailableToCaller;
ULARGE_INTEGER  ulTotalNumberOfFreeBytes;
ULARGE_INTEGER  ulTotalNumberOfBytes;
BOOL (*_GetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);

HINSTANCE hInstDLL = ::LoadLibrary(_T("KERNEL32.DLL"));
if(hInstDLL) {
    if(*((FARPROC *)&_GetDiskFreeSpaceEx) =
        ::GetProcAddress(hInstDLL, _T("GetDiskFreeSpaceExA"))) {           
       if(_GetDiskFreeSpaceEx(strPath, &ulFreeBytesAvailableToCaller, &ulTotalNumberOfBytes, &ulTotalNumberOfFreeBytes)) {
           // ディスク容量の計算
           // 全容量 ulTotalNumberOfBytes.QuadPart
           // 空き容量 ulTotalNumberOfFreeBytes.QuadPart
       }
    }
    ::FreeLibrary(hInstDLL);
}


参照
前後のTips
GetDiskFreeSpaceEx

DSS ProgrammingTipsCGI Ver2.02