我编写了一个Visual C ++程序,它将通过CFile读取文件。但是,该程序的一个用户告诉我,当他使用该程序读取坏扇区硬盘上的文件时,该程序将陷入僵局。
由于在我自己的环境中模拟坏扇区非常困难,我只是想知道CFile在处理坏扇区时会做些什么?
由于
答案 0 :(得分:0)
这是文件系统/磁盘驱动程序级别问题。 CFile本身可能完全没有用于处理坏扇区的逻辑。它(可能)将进行系统调用以使用从文件句柄读取的数据填充固定缓冲区。
如果坏数据导致您的程序死锁,也许您应该尽可能添加完整性检查。例如。校验和还是哈希?如果您检测到损坏的数据,则可以通知用户并中止。
否则唯一合理的解决方案是让用户获得新的磁盘驱动器。
答案 1 :(得分:0)
当CFile
执行读取时,它归结为以下代码:
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
基本上,它只是一个Win32 ReadFile()
调用,如果它没有成功,则抛出异常。
所以我希望在这种情况下抛出一个异常 - 你的代码中的某些内容可能正在捕获,吞噬并忽略异常?当您执行读取并打印消息然后终止程序时,您可以尝试捕获异常。至少你的程序不会陷入僵局'
另一方面,'僵局'可能是Windows或其他一些系统组件(防病毒?)挂起或花了很长时间才确定在它从ReadFile()
调用返回之前出现错误。如果您的用户正在尝试读取带有坏扇区的磁盘,我不确定在您的程序工作中需要付出多少努力才能正常工作#34;这有点像是试图穿过一座已经被淘汰的桥梁,抱怨你的车最终会在河里。