我需要帮助使用 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");
}
接下来,我有我需要的所有集群信息和文件信息(文件大小、文件的最后一个集群位置、磁盘上集群的数量、集群大小等)。如何将卷上的指针设置为从指定的群集位置开始,以便我可以从中读取/写入数据?
最佳答案
主要问题是您为 dwDesiredAccess
指定了 0
。为了读取数据,您应该指定 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
的调用将自动推进它。
关于c++ - 从集群中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24166870/