在fseek之后的未格式化的硬盘驱动器上,fread从512字节扇区的开始读取,而不是寻找位置

时间:2017-03-22 20:19:37

标签: 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()似乎工作正常。

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

非常感谢任何解释。

1 个答案:

答案 0 :(得分:0)

编辑我的回答:

您只需打开阻止设备即可。

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

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