我有一个程序可以打开未格式化的硬盘(在管理模式下)并复制大量数据。由于硬盘驱动器非常大,我必须使用 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/