CFile将如何处理坏扇区

How will CFile deal with bad sectors?

本文关键字:处理 扇区 何处理 CFile      更新时间:2023-10-16

我编写了一个Visual C++程序,它将通过CFile读取文件。但是,该程序的一位用户告诉我,当他使用该程序读取带有坏扇区的硬盘上的文件时,该程序将陷入僵局。

由于在我

自己的环境中模拟坏扇区非常困难,我只是想知道 CFile 在处理坏扇区时会怎么做?

谢谢

这是一个文件系统/磁盘驱动程序级别问题。CFile本身可能完全没有处理坏部门的逻辑。它将(大概)进行系统调用,以使用从文件句柄读取的数据填充固定缓冲区。

如果错误数据导致程序死锁,也许您应该尽可能添加完整性检查。 例如校验和还是哈希?如果检测到损坏的数据,则可以通知用户并中止。

否则,唯一合理的解决方案是让用户获得新的磁盘驱动器。

CFile执行读取时,它归结为以下代码:

if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
    CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);

基本上,它只是一个 Win32 ReadFile()调用,如果不成功,则会引发异常。

所以我希望在这种情况下会抛出一个异常 - 也许你的代码中的某些东西正在捕获、吞噬和忽略异常? 您可以尝试在执行读取时捕获异常并打印消息,然后终止程序。 至少你的程序不会"死锁"。

另一方面,"死锁"可能是Windows或其他一些系统组件(防病毒?)挂起或需要很长时间才能确定存在错误,然后才能从ReadFile()调用返回。如果您的用户试图读取带有坏扇区的磁盘,我不确定要花多少精力才能使您的程序"工作"。 这有点像试图开车穿过一座被冲毁的桥,然后抱怨你的车最终掉进了河里。