GetDiskFreeSpace函数返回错误\无效\函数
我有下面的代码,它应该得到一个外部驱动器的句柄,并得到一个扇区大小GetDiskFreeSpace函数返回错误\无效\函数,c,winapi,C,Winapi,我有下面的代码,它应该得到一个外部驱动器的句柄,并得到一个扇区大小 HANDLE hRawDisk = CreateFile(L"\\\\.\\F:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
HANDLE hRawDisk = CreateFile(L"\\\\.\\F:",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL);
if (hRawDisk == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed\r\n");
PrintLastError();
return -1;
}
DWORD sectorsPerCluster;
DWORD bytesPerSector;
DWORD numberOfFreeClusters;
DWORD totalNumberOfClusters;
if (!GetDiskFreeSpace(L"\\\\.\\F:", §orsPerCluster, &bytesPerSector,
&numberOfFreeClusters, &totalNumberOfClusters))
{
printf("GetDiskFreeSpace failed\r\n");
PrintLastError();
CloseHandle(hRawDisk);
return -2;
}
我不知道为什么函数GetDiskFreeSpace返回ERROR\u INVALID\u函数。是否可能与访问权限有关
使用函数GetDiskFreeSpaceEx会得到完全相同的结果。引用函数
GetDiskFreeSpace
的MSDN文档,关于第一个参数():
要获取其信息的磁盘的根目录
返回。如果此参数为NULL,则函数将使用
当前磁盘。如果此参数是UNC名称,则必须包含
尾随的反斜杠(例如“\MyServer\MyShare\”)此外,
驱动器规格必须有尾随的反斜杠(例如,
“C:\”。调用应用程序必须具有文件列表目录访问权限
此目录的权限
例如,您可以通过以下方式调用该函数:
GetDiskFreeSpace(L"F:\\", §orsPerCluster, &bytesPerSector,
&numberOfFreeClusters, &totalNumberOfClusters)
样本:
auto path = _T("C:\\");
ULARGE_INTEGER FreeBytesAvailable = { 0 };
ULARGE_INTEGER TotalNumberOfBytes={ 0 };
ULARGE_INTEGER TotalNumberOfFreeBytes={ 0 };
BOOL ok = GetDiskFreeSpaceEx(
path,
&FreeBytesAvailable,
&TotalNumberOfBytes,
&TotalNumberOfFreeBytes
);
if (ok)
{
unsigned long long freeAvail = FreeBytesAvailable.QuadPart;
unsigned long long total = TotalNumberOfBytes.QuadPart;
unsigned long long totalfree = TotalNumberOfFreeBytes.QuadPart;
TRACE("\nfree for user: MB: %lld; Total for user: MB: %lld, Free total MB:%lld \n", freeAvail /1024/1024, total / 1024 / 1024, totalfree / 1024 / 1024);
/// if eventually using MFC:
CString s;
s.Format(_T("free for user: MB: %lld; Total for user: MB: %lld, Free total MB:%lld \n"), freeAvail / 1024 / 1024, total / 1024 / 1024, totalfree / 1024 / 1024);
在MSDN文档中,
驱动器规格必须有一个尾随反斜杠(例如,“C:\”)
.Wow。我不敢相信我竟然忽略了它。谢谢。您的错误处理代码不正确,您必须先调用GetLastError(),然后才能执行其他操作。printf()将错误值弄糟了,因为它也在幕后进行操作系统调用。