我需要帮助,使用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
将自动进行。