gpt4 book ai didi

c++ - 从集群中读取数据

转载 作者:行者123 更新时间:2023-11-30 01:52:42 24 4
gpt4 key购买 nike

我需要帮助使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com