CFile将如何处理坏扇区
How will CFile deal with bad sectors?
我编写了一个Visual C++程序,它将通过CFile读取文件。但是,该程序的一位用户告诉我,当他使用该程序读取带有坏扇区的硬盘上的文件时,该程序将陷入僵局。
由于在我自己的环境中模拟坏扇区非常困难,我只是想知道 CFile 在处理坏扇区时会怎么做?
谢谢
这是一个文件系统/磁盘驱动程序级别问题。CFile本身可能完全没有处理坏部门的逻辑。它将(大概)进行系统调用,以使用从文件句柄读取的数据填充固定缓冲区。
如果错误数据导致程序死锁,也许您应该尽可能添加完整性检查。 例如校验和还是哈希?如果检测到损坏的数据,则可以通知用户并中止。
否则,唯一合理的解决方案是让用户获得新的磁盘驱动器。
当CFile
执行读取时,它归结为以下代码:
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName);
基本上,它只是一个 Win32 ReadFile()
调用,如果不成功,则会引发异常。
所以我希望在这种情况下会抛出一个异常 - 也许你的代码中的某些东西正在捕获、吞噬和忽略异常? 您可以尝试在执行读取时捕获异常并打印消息,然后终止程序。 至少你的程序不会"死锁"。
另一方面,"死锁"可能是Windows或其他一些系统组件(防病毒?)挂起或需要很长时间才能确定存在错误,然后才能从ReadFile()
调用返回。如果您的用户试图读取带有坏扇区的磁盘,我不确定要花多少精力才能使您的程序"工作"。 这有点像试图开车穿过一座被冲毁的桥,然后抱怨你的车最终掉进了河里。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 如何使用ATA命令读取磁盘的特定扇区
- 获得有关硬盘扇区中原始数据更改的通知-文件更改通知
- 如何以编程方式使用 MBR 和 USB 闪存扇区
- 写入文件的原始磁盘扇区
- 找到一个位于扇区内部的点
- 如何使用 SDL 2 和 C++ 绘制椭圆的填充扇区
- CFile将如何处理坏扇区
- 原始读取带有 fstream 的引导扇区
- C++将数据写入随机HDD扇区
- 使用哪个小部件将硬盘扇区显示为十六进制
- 在Linux上用c++读取硬盘扇区
- ReadFile FILE_FLAG_NO_BUFFERING如何读取两个扇区之间的数据
- 写入文件失败,错误码为87,每个扇区磁盘4096字节
- DeviceIoControl返回意外的物理扇区大小
- 如何在CD或DVD上获得扇区的准确位置和角度(数据位置测量)