断続的に動作する故障したハードドライブがあります。コールドブート後、約30〜60秒間アクセスできますが、ハードドライブに障害が発生します。このドライブを新しくて大きなディスクにバックアップするソフトウェアを作成したいと思います。GNU/LinuxまたはWindowsで開発できます。気にしません。
問題は次のとおりです。ディスクにアクセスできるのはしばらくの間だけで、ファイルが大きく、コピーにかかるファイルよりも時間がかかる場合があります。このため、ハードディスク全体を少しずつバックアップすることを考えています。これは、ビットトレントのようなものです。別のセットを読み取ろうとする前に、数メガバイトを読み取って保存します。私のメインループは次のようになります。
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; }
}
問題はcheck_harddrive()関数です。APIとライブラリの互換性を最大限に高めるために、これをC /C++で記述したいと思います。ファイルハンドラーがまだ有効かどうかを確認するには、ファイルハンドラーをある程度制御する必要があります。また、不良データを返すものが必要ですが、コピープロセス中にドライブに障害が発生した場合は戻ります。
「ハードコードされた」ハードウェア例外を悪用した場合、C#で最良の結果が得られるのではないでしょうか。
もう1つのアプローチは、ハードドライブの電源を入れ直すのに必要な時間を測定し、この時間だけ読み取るようにプログラムをコーディングして、電源を入れ直すタイミングにフラグを立てることです。
この場合、あなたはどうしますか?すでにこれを行っているツール/ユーティリティはありますか?
ああ、ここに悪い光学メディアを読むための素晴らしいアプリがあります、それはIsoPuzzleと呼ばれています、それは私のものではありません、私は私の問題に関連する何かを共有したかっただけです。
!編集!
いくつかの説明。私はホームユーザーであり、大学のコンピューターエンジニアリングの学生です。データを回復するために数千ドルを費やすよりも、データを失いたいと思っています。ハードドライブはまだシーゲイトの保証の対象ですが、5年間の保証が付いているので、時間がなくなるまで可能な限りのことを試してみたいと思います。
コールドブートとは、電源が入っていない状態で数秒後にブートすることを意味します。ホットブートはコンピュータを再起動し、コールドブートはコンピュータをシャットダウンし、数秒待ってから再度起動します。問題のハードディスクは内蔵ですがSATAなので、電源ケーブルを外し、数秒待ってから再度接続するだけです。
今まではrobocopyを使用しますが、それを検索して、どのように使用できるかを確認しています。自分でコーディングする必要はなく、スクリプトを作成する必要がある場合は、さらに簡単になります。
!EDIT2!
はっきりしていませんでした。私のドライブはSeagate7200.11です。ファームウェアが不良であることがわかっており、単純なファームウェアアップデートで常に修正できるとは限りません(このバグが発生した後ではありません)。ドライブは物理的に100%動作状態にあり、ファームウェアがねじ込まれているだけで、数秒後に無限のビジー状態になります。