Drive空き容量をもとめる
無印Win95 には GetDiskFreeSpaceEx がないので場合分けが必要。
double GetDiskFreeSpaceBytes(LPCTSTR szDrive)
{
double dRet;
BOOL (WINAPI *pGetDiskFreeSpaceEx)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
#ifdef _UNICODE
pGetDiskFreeSpaceEx = (BOOL (WINAPI *)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER))
GetProcAddress( GetModuleHandle("kernel32.dll"), "GetDiskFreeSpaceExW");
#else
pGetDiskFreeSpaceEx = (BOOL (WINAPI *)(LPCSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER))
GetProcAddress( GetModuleHandle("kernel32.dll"), "GetDiskFreeSpaceExA");
#endif
if (pGetDiskFreeSpaceEx)
{
ULARGE_INTEGER i64FreeBytesToCaller; // bytes available to caller
ULARGE_INTEGER i64TotalBytes; // bytes on disk
ULARGE_INTEGER i64FreeBytes;
if (!pGetDiskFreeSpaceEx(szDrive, &i64FreeBytesToCaller, &i64TotalBytes, &i64FreeBytes))
return -1.0;
dRet = (double)(signed __int64)i64FreeBytes.QuadPart;
}
else
{
DWORD dwSectPerClust;
DWORD dwBytesPerSect;
DWORD dwFreeClusters;
DWORD dwTotalClusters;
if (!GetDiskFreeSpace (szDrive, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters))
return -1.0;
dRet = dwFreeClusters * dwSectPerClust * dwBytesPerSect;
}
return dRet;
}