強制ファイルコピープログラム:fcopy.exe
はじめに
ハードディスクの寿命は突然やってきます。仕事ならいざしらず、個人の趣味の範囲でPCを利用している場合、毎日バックアップを取っている人はまれでしょう。運が悪ければ、1か月分の動画、写真を一気に失うこともあります。
ハードディスクが寿命を迎える時は、リードエラーの増加という症状で始まることが多いようです。ファイルをコピーしようとして、ハードディスクのおかしなシーク音が何度も聞こえ、『CRCエラーです』といったエラーメッセージとともにコピー失敗という現象が突きつけられます。
最近のディジタルデータは、サイズが大きいものが多く、特に個人撮影の動画やアーカイブファイルにまとめた画像データなどの場合、わずか1セクタのリードエラーでそのデータ全てを失うことになり、あまりにもダメージが大きいと感じるのは私だけではないと思います。
動画の場合、ファイルの一部が壊れていても、その部分のみ映像が乱れるというだけで済みます。ファイル一本失うよりは、ファイルの一部が壊れてもいいから、コピーできたほうがユーザーにとってメリットがあります。そのような理由から作ったのがこのプログラムです。
FCOPY.EXE の機能
FCOPY.EXE は、コピー元ファイルにリードエラーが発生しても、強制的にコピーを継続するファイルコピープログラムです。コマンドプロンプトから起動します。以下の機能があります。
- ブロック単位でファイルをコピーする。
- ブロックサイズはデフォルトで32KBだが、/b
オプションで指定可能。
- 指定可能なサイズは、512Bから64KBまでの2のべき乗。
- リードエラーが出たブロックは、0で埋められてコピー先ファイルに書き込まれる。
使用方法
PATH の通ったディレクトリに、DIRLIST.EXE
をコピーしてください。Borland C++ をインストールしている人は、C:\borland\bcc55\bin
などに入れておくと良いでしょう。
書式は、以下のとおり。
FCOPY [/option] コピー元パス名 コピー先パス名
option は以下のものが指定できます。
- /b : ブロックサイズを指定する 例: /b 4096
コピー元PATH名は、ディレクトリ名\ファイル名、コピー元PATH名は、ディレクトリ名か、ディレクトリ名\ファイル名 を指定します。ディレクトリ名は絶対パス、相対パスのいづれもOKです。
実行例

この例では、2ブロックがリードエラーで読めませんでしたが、強制コピーが継続され、コピー先のファイルサイズはコピー元のファイルサイズと同じになっています。なお、単純なバイナリコピーを行っていますので、ファイルの属性やタイムスタンプはコピーされません。
Win2Kの場合、USB接続のディスクは内蔵HDDよりもリトライ回数が多く、コピーにかなり時間がかかります。実際に使用する場合、なるべくブロックサイズを小さくして、被害を最小限に抑えようと試行錯誤することになると思いますが、その場合は、HDDをUSB接続ではなく、ATAPI/SATA接続した方が良いでしょう。
ダウンロード
たいしたプログラムでは有りませんが、何かの役に立つかもしれませんので、ソースごと公開します。
ソースコード&実行ファイル