检查硬盘上的坏扇区
Posted
技术标签:
【中文标题】检查硬盘上的坏扇区【英文标题】:check for bad sectors on hard disk 【发布时间】:2013-03-18 16:56:33 【问题描述】:最近几次停电后,我的电脑变得很乱(不时出现蓝屏,整个操作系统的行为真的很奇怪)。
现在我有一个程序在我的电脑出现故障之前运行得非常好。这个程序基本上只是使用CreateFile
创建一个文件并使用WriteFile
写入它。这个程序还有其他的东西基于这个文件做他们的事情。我注意到整个程序的行为也很奇怪。
我的调试结果:
我注意到在CreateFile
之后,文件是在它所在的位置创建的
应该是(使用资源管理器和命令行检查)。
WriteFile
没有写入文件(再次使用资源管理器和命令行检查)。
WriteFile
之后,每当我在资源管理器中双击该文件或对该文件执行任何操作时,一切都表现为该文件不存在。
所有 API 都返回了各自的成功代码。绝对没有错误。
在我停止我的程序并退出 IDE 后,我进入资源管理器并尝试删除包含上面创建的文件的文件夹,它显示了这个:
文件已被删除。
注意:上述情况并不总是发生。
由于上述调试,我得出的结论是,由于我的整个操作系统表现异常,我的程序也表现异常。我的程序没有错误(因为在那些该死的停电之前一切正常)。
不管怎样,微软有this to say about that error。基本上我的硬盘有很多坏扇区。
我的问题:有没有办法以编程方式检查硬盘在 C 语言中是否正常?这种检测不需要是 100% 正确的。但是,我确实希望此检查非常快(因为我做了很多写操作等)。
我想要这个检查,因为到目前为止,我的程序的其余部分认为文件在那里并且准备好了(因为没有返回错误)并且随之而来的是各种奇怪的行为。作为一个可能不知道他/她的硬盘被分区的用户,我希望我的程序建议运行磁盘检查。
【问题讨论】:
google.co.uk/search?q=windows+check+disk+for+errors @NPE, “有没有办法以编程方式检查硬盘驱动器在 C 语言中是否正常?” 除非您的程序是某种应该知道此类问题的实用程序,否则建议用户检查磁盘是否有错误会很奇怪 @msam,该消息只是一种可能性。但我绝对不希望我的程序在发现这种情况时继续运行。 尝试使用FILE_FLAG_NO_BUFFERING
标志打开文件,以便写入立即刷新到磁盘并且不通过磁盘缓存...所以您可能会在返回中看到一些错误WriteFile
的代码。但是,这也会降低性能。
【参考方案1】:
您最好通过一个 API 来查看 S.M.A.R.T 故障前通知,该 API 允许在驱动器问题发生之前对其进行早期警告。 Here 是我很快找到的一种实现,它似乎适用于您的平台,但我尚未对其进行测试。
我怀疑有更好的可用。这种 SMART 方法的主要优点是在问题变得重要之前发现问题。但是,许多操作系统都内置了此功能,除了磁盘实用程序之外,很少在应用程序级别使用此功能。
【讨论】:
【参考方案2】:由于您的应用程序是在操作系统之上构建的,因此您必须依赖它的错误报告并将它们传递出去。您不能假设特定错误意味着它需要磁盘检查。
在您的情况下,我建议运行全盘检查并照常进行。
【讨论】:
以上是关于检查硬盘上的坏扇区的主要内容,如果未能解决你的问题,请参考以下文章
Exadata Adaptive Scrubbing Schedule