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

标签 c++ winapi file-io

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

相关文章:

c++ - 自 c++17 以来,复制省略不需要复制或移动构造函数的存在和可访问性

c - Win32 通信嗅探

c++ - 在 C++ 中访问 UNC 驱动器/远程网络驱动器

c++ - 检查套接字是否已在 C++ 中关闭

C++ 文件操作在嵌入式 Linux 上导致 "crash"

c++ - 错误 : Initial value of reference to non-const must be an lvalue

c++ - 私有(private)继承与公开迭代器

c++ - 如果指针指向一个新对象,信号/槽连接会发生什么

c - 使用 fgets 在 C 中检测 EOL

c - 动态从文件中获取数据