c - 在 fseek 之后未格式化的硬盘上,fread 从 512 字节扇区的开头读取,而不是查找位置

标签 c windows

我有一个程序可以打开未格式化的硬盘(在管理模式下)并复制大量数据。由于硬盘驱动器非常大,我必须使用 fseek() 快速浏览硬盘驱动器。

首先,我使用以下函数进行迭代。

//pseudo code
int fd;
FILE* f;
HANDLE hDisk;
wchar_t dsk[512] = L"";

hDisk = CreateFile(dsk, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, NULL, NULL);

fd = _open_osfhandle((intptr_t)hDisk, _O_RDONLY);  //file descriptor

f= _fdopen(fd, "rb"); // converts file descriptor to a file pointer


//then I use,

FILE * pFile_A = f;
char test_seek_array[779];

fseek(pFile_A, 973, SEEK_CUR); 
fread(test_seek_array, 1, 779, pFile_A);

//end of pseudo code

问题是 fseek() 无法正常工作(可能是 fread() 的问题)。当您在 fseek() 之后执行 fread() 时,它会从 512 字节扇区的开头开始读取,而不是从文件指针的当前位置(在 512 字节扇区内)开始读取。

因此,它似乎不是从文件指针的当前位置开始读取,而是从 512 字节扇区的开头读取。

为什么会发生这种情况?另一个有趣的点是带有负偏移量的 fseek() 似乎工作得很好。

我的转换正确吗?从句柄到文件指针?操作系统似乎想要读取 512 字节 block 。这可能是问题所在吗?我确实在每次 fseek() 和 fread() 之后进行了错误检查。他们似乎都成功了。

非常感谢任何解释。

最佳答案

编辑我的答案:

您只需打开 block 设备即可。

打开整个 block 设备的基本前提是允许访问磁盘。能够使用 fseek()

最好在扇区边界的每次 I/O 操作上 I/O 一个完整的磁盘扇区

关于c - 在 fseek 之后未格式化的硬盘上,fread 从 512 字节扇区的开头读取,而不是查找位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961866/

相关文章:

c - 从文本文件自动输入到 C 程序

python - Cython 导入工作一次 - 然后给出 gcc.bat 错误

c++ - 下载文件,winsock recv() 写入 fstream,文件损坏

Android 手机未检测到在我的笔记本电脑上创建的无线网络

c++ - 如何从本地目录加载 C++ 中的图像

c - 编译背后的主要步骤是什么?

c - -fopenmp 提供什么预处理器定义?

c++ - 在 Windows 中使用 C/C++ 通过 USB 向打印机发送命令

c - 服务器 TCP 卡在 read() 上

c++ - 如何使用 C++ 在 Windows 中获取硬件信息?