我有一个打开未格式化硬盘的程序(在管理模式下)并复制大量数据。由于硬盘驱动器非常大,我必须使用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()似乎工作正常。
我的转换是否正确?从HANDLE转到文件指针?操作系统似乎想要读取512字节的块。这可能是问题吗?我确实在每个fseek()和fread()之后进行了错误检查。他们似乎都很成功。
非常感谢任何解释。
答案 0 :(得分:0)
编辑我的回答:
您只需打开阻止设备即可。
打开整个块设备的基本前提是允许访问磁盘。能够fseek()
最好在扇区边界的每个I / O操作上I / O一个完整的磁盘扇区