如何一致地读取间歇性硬盘?

Spi*_*dey 2 c c# c++ hardware hard-drive

我有一个故障的硬盘驱动器间歇性地工作.冷启动后,我可以访问它大约30-60秒,然后硬盘驱动器失败.我愿意编写一个软件来将这个驱动器备份到一个新的更大的磁盘上.我可以在GNU/Linux或Windows下开发它,我不在乎.

问题是:我只能访问磁盘一段时间,并且有些文件很大,需要的时间比要复制的要长.出于这个原因,我正在考虑将整个硬盘备份成较小的部分,例如bit trenting.在尝试阅读另一组之前,我会阅读一些兆字节并存储它.我的主循环将是这样的:

while(1){
    if(!check_harddrive()){ sleep(100ms); continue; }
    read_some_megabytes();
    if(!check_harddrive()){ sleep(100ms); continue; }
    save_data();
    update_reading_pointer();
    if(all_done){ break; }
}
Run Code Online (Sandbox Code Playgroud)

问题是check_harddrive()函数.我愿意用C/C++编写这个,以获得最大的API /库兼容性.我需要对文件处理程序进行一些控制以检查它们是否仍然有效,并且我需要一些东西来返回错误数据,但如果驱动器在复制过程中失败则返回.

如果我滥用"硬编码"硬件异常,C#会给我最好的结果吗?

另一种方法是测量我需要多长时间来重启我的硬盘驱动器,并编程程序只在这段时间内读取它,并标记我何时重启电源.

在这种情况下你会做什么?是否有任何工具/实用程序已经这样做了?

哦,有一个伟大的应用程序来读取坏光学媒体在这里,它被称为IsoPuzzle,它不是我的,我只是想分享一些与我的问题相关的东西.

!编辑!

一些澄清.我是家庭用户,是大学计算机工程专业的学生,​​我宁愿丢失数据而不是花费数千美元来恢复它.希捷的保修仍然涵盖了硬盘,但由于他们给了我5年的保修期,我想尽一切可能,直到时间用完.

当我说冷启动时,我的意思是在没有电源的情况下启动几秒钟.热启动将重新启动计算机,冷启动将关闭它,等待几秒钟然后再次启动它.由于有问题的硬盘是内置的SATA,我可以断开电源线,等待几秒钟再重新连接.

到现在为止,我将使用robocopy,我只是在寻找它,看看我如何使用它.如果我不需要编写自己的代码,而是编写脚本,那就更容易了.

!EDIT2!

我不清楚,我的驱动器是希捷7200.11.众所周知,它有一个糟糕的固件,并不总是可以通过简单的固件更新来修复(不会出现此错误).驱动器在物理上处于工作状态的100%,只是固件被拧紧,使其在几秒钟后进入无限繁忙状态.

Ken*_*ner 6

我会先从硬件角度来解决这个问题.它是一个外部驱动器 - 如果是这样,你能在不同的情况下尝试吗?

你提到冷启动工作,然后退出.这与热有关吗?你有没有尝试过像冰箱一样长时间使用硬盘?

从软件方面来说,我有一个第二个线程,密切关注一些重复循环读取少量数据更新的进度计数器,然后它将能够通过您定义的超时发出故障信号.