我写了一个可视化的C++程序,它将通过CFile读取文件。然而,该程序的一位用户告诉我,当他使用该程序读取硬盘上有坏扇区的文件时,程序将会死锁。
因为很难在我自己的环境中模拟一个坏扇区,所以我想知道CFile在处理坏扇区时会做什么?
谢谢
发布于 2016-02-28 12:19:37
这是一个文件系统/磁盘驱动程序级别的问题。CFile本身可能完全没有处理坏扇区的逻辑。它将(可能)进行系统调用,用从文件句柄读取的数据填充固定的缓冲区。
如果坏数据导致您的程序死锁,您可能应该添加完整性检查。例如,校验和或散列?如果您检测到损坏的数据,则可以通知用户并中止。
否则,唯一合理的解决方案是让用户获得新的磁盘驱动器。
发布于 2016-02-28 13:45:41
当CFile执行读取时,它归结为以下代码:
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);基本上,它只是一个Win32 ReadFile()调用,如果它不成功,就会抛出一个异常。
所以我希望在这种情况下会抛出一个异常--也许你的代码中的某些东西正在捕获、吞噬和忽略该异常?您可以尝试在执行读取操作时捕获异常,并打印一条消息,然后终止程序。至少你的程序不会“死锁”。
另一方面,“死锁”可能是Windows或其他系统组件(防病毒?)在从ReadFile()调用返回之前,挂起或花费很长很长的时间来确定是否存在错误。如果您的用户正在尝试读取磁盘上的坏扇区,我不确定需要多大的努力才能使您的程序“工作”。这就像是试图开车过一座被冲垮的桥,然后抱怨你的车掉进了河里。
https://stackoverflow.com/questions/35678037
复制相似问题