使用Delphi或freepascal检测坏扇区

时间:2014-06-18 21:47:26

标签: delphi file-io freepascal sector

感谢David Heffernan的帮助,我有一个用Freepascal编写的程序(但我的问题的Delphi解决方案就足够了),它按扇区读取物理磁盘扇区。它使用Windows API CreateFileW函数为磁盘句柄,然后FileFileFileSeek等进行导航和读取。如果所有扇区都没问题,它可以正常工作。但是,如果磁盘有坏扇区,我需要区别对待它们。

我的问题是,是否有可以使用的程序或库,同时阅读这些部门,以确定它们是否是坏扇区?如果没有,我该怎么办呢?我知道它是磁盘控制器,知道什么扇区是坏的,哪些不是,所以我不认为我的程序实际上可以访问坏扇区,那么如何检测哪些是坏扇区并采取相应措施?是否需要查询SMART,如果需要,如何查询?

我搜索了这个网站(只找到this C post,它与程序有关,而不是代码)并用Google搜索,没有明显的解决方案引起我的注意。

2 个答案:

答案 0 :(得分:2)

部门及其硬件状态不是普通用户级代码需要处理的事情,因此没有简单的复制/粘贴API可用于此目的。

一般而言,行业概念在多个层面上被抽象出来。举一个例子,请参阅Wikipedia: logical disk address translation。物理部门的地位是非常低级的概念。一些硬件供应商甚至根本不通过公共API公开它。通常在硬件本身中检测到坏(或可疑)扇区并自动重定向到其他位置。所以一般来说坏磁盘扇区概念不存在

MSDN Logging Guidelines

  

... 坏扇区。如果磁盘驱动程序遇到坏扇区,它可能会在重试操作后读取或写入扇区,但扇区最终会变坏。如果磁盘驱动程序可以继续,它应该记录一个警告事件;否则,应记录错误事件。如果文件系统驱动程序发现大量坏扇区并修复它们,则记录警告事件可能有助于管理员确定磁盘可能即将失败...

如果你真的需要使用这个低级概念,那么首先要忘记Pascal或Delphi作为你的要求。

了解如何使用Windows API,一旦您知道它以您选择的语言绑定到API(您可以轻松地将任何Win32用户级API函数映射到Free Pascal)。

在我看来,你将在黑暗中游泳。没有手电筒和游泳圈的深水区域,您应该三思而后行(或您的用户)真正需要/想要的东西,或许可以改进问题以获得合理大小的主题答案

答案 1 :(得分:2)

一般来说,你根本无法访问坏扇区(它们已被重新映射,因此不在LBA中)。您可以访问的是待处理扇区,尝试读取它们将始终导致读取错误。 SMART将告诉您除了坏/待处理扇区的数量。所以你可能应该继续使用选择的API解释持久读取错误作为“坏”扇区的诊断,只需确保它们不是由访问共享冲突引起的。 如果你想以某种方式获得一个p列表或g列表,它只能在终端模式下(对于PATA / SATA,而不是SCSI),需要连接到HDD的服务端口,USB到COM适配器,并且是供应商 - 和产品特定的,如果可能的话。