从集群读取数据
Reading data off of a cluster
我需要帮助从使用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" << "nn";
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
的调用将自动推进。
在进行随机访问I/O时,完全不要打乱存储在文件句柄中的文件指针。相反,使用OVERLAPPED
结构并为每个I/O操作指定位置。
这甚至适用于同步I/O(如果文件打开时没有FILE_FLAG_OVERLAPPED
)。
当然,正如David所提到的,如果您在没有足够访问权限的情况下使用打开的文件句柄执行操作,您将获得ERROR_ACCESS_DENIED
。
- C++将文本文件中的数据读取到结构数组中
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 如何将来自文本文件的数据读取到结构的int阵列中
- 如何将不同长度的数据读取到 2D 数组中
- 从TXT文件到C 的结构向量中的数据读取
- 将sqlite原始数据读取到qbyTearray
- 如何将来自输入TXT文件的数据读取到2 C 数组中
- 使用MQQueue将数据读取到缓冲区中时麻烦
- 在 VC++ 中将类数据读取和写入二进制文件
- 将数据从数据读取器终端获取到GUI(QtCreator)
- C 将数据读取到一个结构,但它跳过了我的一个获取线,使该元素空白
- C++将二进制数据读取到结构
- c++我需要将文件中的数据读取到多维数组中,然后用一种数据类型对数组进行排序.怎样
- 对齐数据:速度取决于恒定数据读取的相对采样大小和采样频率
- 如何将文件中的数据读取到数组中
- 如何使用Visual C++应用程序的完整应用程序数据读取Minidump的应用程序数据
- 如何将csv文件数据读取到数组中
- 用C++将格式化的数值数据读取到数组中
- 正在从文件中将数据读取到结构数组中
- 将分离的数据读取到数组结构c++中