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?
22 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"; } 1GetDiskFreeSpaceExA does not allocate memory for its results.
You need to have ULARGE_INTEGER variables and pass pointers to it.