Q: How can I check the free space on a partition?
A:
Code:
typedef BOOL (WINAPI *PFNGETDISKFREESPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
#include <iostream>
HINSTANCE hModule = ::LoadLibrary("KERNEL32.DLL");
if(hModule)
{
PFNGETDISKFREESPACEEX pDiskFreeSpaceEx = NULL;
// Determine function to use
pDiskFreeSpaceEx = reinterpret_cast<PFNGETDISKFREESPACEEX>(::GetProcAddress(hModule,
"GetDiskFreeSpaceExA"));
if(!pDiskFreeSpaceEx)
{
DWORD dwSectorsPerCluster = 0;
DWORD dwBytesPerSector = 0;
DWORD dwFreeClusters = 0;
DWORD dwClusters = 0;
if(::GetDiskFreeSpace(strRootPath.c_str(),
&dwSectorsPerCluster,
&dwBytesPerSector,
&dwFreeClusters,
&dwClusters) == TRUE)
std::cout << "Available disk space = "
<< dwFreeClusters * dwBytesPerSector * dwSectorsPerCluster << " MB" << std::endl;
else
// Error
}
else
{
ULARGE_INTEGER uliFreeBytesAvailableToCaller;
ULARGE_INTEGER uliTotalNumberOfBytes;
ULARGE_INTEGER uliTotalNumberOfFreeBytes;
if(::GetDiskFreeSpaceEx(strRootPath.c_str(),
&uliFreeBytesAvailableToCaller,
&uliTotalNumberOfBytes,
&uliTotalNumberOfFreeBytes) == TRUE)
std::cout << "Available disk space = "
<< static_cast<int>(static_cast<__int64>(uliFreeBytesAvailableToCaller.QuadPart /
(1024 * 1024)))
<< " MB" << std::endl;
else
// Error
}
// Release library
::FreeLibrary(hModule);
}
else
// Error -> call ::GetLastError()