Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GetDiskFreeSpace函数返回错误\无效\函数_C_Winapi - Fatal编程技术网

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:", &sectorsPerCluster, &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:\\", &sectorsPerCluster, &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()将错误值弄糟了,因为它也在幕后进行操作系统调用。