我需要帮助,使用CreateFile()然后使用ReadFile()从文件的最后一个簇读取数据。首先,我对ReadFile()的结果保持为零,因为我认为自己在CreateFile()中设置的权限不正确。

/**********CreateFile for volume ********/

        HANDLE hDevice = INVALID_HANDLE_VALUE;
            hDevice = CreateFile(L"\\\\.\\C:",
            0,
            FILE_SHARE_READ |
            FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);

        if (hDevice == INVALID_HANDLE_VALUE)
        {
            wcout << "error at hDevice at CreateFile "<< endl;
            system("pause");
        }

        /******* Read file from the volume *********/
        DWORD nRead;
        TCHAR buff[4096];
        if (BOOL fileFromVol = ReadFile(
            hDevice,
            buff,
            4096,
            &nRead,
            NULL
            ) == 0) {
            cout << "Error with fileFromVol" << "\n\n";
            system("pause");
        }

接下来,我具有所需的所有群集信息和文件信息(文件大小,文件的最后群集位置,磁盘上的群集数量,群集大小等)。如何将卷上的指针设置为从指定的群集位置开始,以便可以从中读取/写入数据?

最佳答案

主要问题是您为0指定dwDesiredAccess。为了读取数据,您应该指定FILE_READ_DATA

最重要的是,我严重质疑TCHAR的使用。当您需要支持Windows 9x时,这适用于文本。除了不需要支持Windows 9x,数据不是文本。您的缓冲区应为unsigned char类型。

显然,您需要缓冲区为群集大小的倍数。您已经对4096进行了硬编码,但是实际的代码肯定应该查询集群的大小。

这些API调用中的任何一个失败时,它们都会在最后一个错误值中指示失败原因。您可以通过调用GetLastError获得它。当您的ReadFile失败时,它将返回ERROR_ACCESS_DENIED

您可以通过调用SetFilePointerEx来查找该卷。同样,您将需要寻找群集大小的倍数。

LARGE_INTEGER dist;
dist.QuadPart = ClusterNum * ClusterSize;
BOOL res = SetFilePointerEx(hFile, dist, nullptr, FILE_BEGIN);
if (!res)
    // handle error

如果按顺序阅读,则无需设置文件指针。调用ReadFile将自动进行。

10-07 13:16
查看更多