I am not understanding something here. I am trying to use the GetDiskFreeSpaceExA function to get the drive space of a drive. When I run the following code:
// Setup the DWORD variables.
PULARGE_INTEGER lpFreeBytesAvailableToCaller{},
lpTotalNumberOfBytes{},
lpTotalNumberOfFreeBytes{};
// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/
if (GetDiskFreeSpaceExA(NULL, lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes)) {
std::cout << lpTotalNumberOfBytes << "\n";
}
All I get back is "0000000000000000". I know there is something I am missing, can anyone shed some light on it?
2 Answers
You are passing NULL pointers to GetDiskFreeSpaceExA(), they don't point anywhere meaningful for it to write its output values to.
Declare local non-pointer variables, and pass them to GetDiskFreeSpaceExA() using the & address operator, eg:
// Setup the DWORD variables.
ULARGE_INTEGER FreeBytesAvailableToCaller,
TotalNumberOfBytes,
TotalNumberOfFreeBytes;
// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/
if (GetDiskFreeSpaceExA(/*letter.c_str()*/NULL, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes)) {
std::cout << TotalNumberOfBytes.QuadPart << "\n";
}
Alternatively,GetDiskFreeSpaceExA() lets you query just the values you actually want, you don't need to ask for all of them if you are not going to use all of them, eg:
// Setup the DWORD variables.
ULARGE_INTEGER TotalNumberOfBytes;
// Lets construct the drive letter based on what the user passed.
/*std::string letter;
letter += driveLetter;
letter += ":\\";
letter += "\0";*/
if (GetDiskFreeSpaceExA(/*letter.c_str()*/NULL, NULL, &TotalNumberOfBytes, NULL)) {
std::cout << TotalNumberOfBytes.QuadPart << "\n";
}
GetDiskFreeSpaceExA does not allocate memory for its results.
You need to have ULARGE_INTEGER variables and pass pointers to it.