あふからTeraCopyを呼び出す。

あふで大きなファイルのコピーなど行うと、その間は操作をすることが出来ない。定番は、Fire File Copyを外部コマンドとして呼び出すことだ。先人の設定を参考に俺も使っていたのだけど、なぜか頻繁にコピー失敗するので使い物にならない。
代用品を探してみると、TeraCopyが良さそうだった。ComanndLineのインタフェースもあるのだけど、複数ファイルの場合に癖があった。複数ファイルの場合はファイルリストを保存して、それをファイルコマンドで渡す必要がある。ヘルプファイルには、下記のような例が書かれている。

TeraCopy.exe Move *C:\Temp\filelist.cmd C:\My Documents /OverwriteAll /NoClose 

これだと、あふが提供している機能では使うことが出来ない(と思う)。使えないなぁとあきらめていたのだけど、失敗を続けるFire File Copyを削除することにしたので、ラッパーを作ってあふから実行できるようにすることにした。頻繁に使うコマンドになりそうなので、バッチファイルで作ることにした。

TeraCopyをコマンドラインから呼び出すバッチファイル

バッチファイルを書くのは2,3年ぶりなので、これだけで数時間もかけてしまった。
(2010.4.23追記)ディレクトリを選択した時のコピーが正常に動作していないので使わないでください。バッチファイルで作るのは限界かなぁ。
(2010.4.30追記)確認した環境自体がおかしいようだった。自宅ではディレクトリを選択しても正常に動作している。

@echo off
set COMD=%1
set TARGETDIR=%2
set RFILE=%TMP%\%~n0%random%
if exist %RFILE% del %RFILE%
:makelist
if .%3==. GOTO end
echo %~3>>%RFILE%
SHIFT
GOTO makelist
:end
"C:\Program Files\TeraCopy\TeraCopy.exe" %COMD% *%RFILE% %TARGETDIR% /OverwriteOlder
del %RFILE%
使い方

上の記述をteracopy_wrap.batとして保存して、下のように使う。

teracopy_wrap COPY C:\WINDOWS D:\Temp\TUTORIAL.txt D:\cygwin\Cygwin.bat

ターゲットファイルとソースファイルの順番が、普通と逆になっている理由は、実装を簡略化するためです。ソースファイルが複数選択される場合があるので、先にターゲットファイルを決めておけば、残り全てがソースファイルになるのだ。インテルニーモニックと同じ方向と考えれば、違和感ないとうそぶいておく。

teracopy_wrap コマンド(COPY|MOVE) ターゲットディレクトリ ソースファイル(複数選択可)

あふからは、バッチファイルをこのように呼び出す。

teracopy_wrap.bat COPY "$O" $MF

自分は下記の記述でキーに割り振っている。

K0000="5067D:\bin\teracopy_wrap.bat COPY "$O" $MF"
K0002="5077D:\bin\teracopy_wrap.bat MOVE "$O" $MF"

解説

環境変数TMPに設定したフォルダ以下に、ランダムなファイル名でファイルリストを作成します。コマンド名も含めてランダムなファイル名にしているので、さすがに衝突はしないと思っています。本当は衝突したらリトライするべきですが、ファイル削除することで横着しました。

set COMD=%1
set TARGETDIR=%2
set RFILE=%TMP%\%~n0%random%
if exist %RFILE% del %RFILE%

次に、ループでファイルリストを出力しています。本格的に作るならコマンドオプションのチェックなどもするべきです。

:makelist
if .%3==. GOTO end
echo %~3>>%RFILE%
SHIFT
GOTO makelist
:end

最初は>>の前後に空白を入れると保存されたファイルリストの最後に空白文字が入ってしまい、正常に動かなかった。原因に気づくまで結構な時間を必要とした。バッチファイルは難しいなぁ。

echo %~3 >> %RFILE%

最後に、TeraCopyのコマンドを呼び出します。処理が終わったら、ファイルリストは消しておきます。

C:\Program Files\TeraCopy\TeraCopy.exe" %COMD% *%RFILE% %TARGETDIR% /OverwriteOlder
del %RFILE%

問題点

バッチファイルを捨てて、C言語でコマンドにするのが自然なのだろうなぁ。

コマンドプロンプトが表示される。

バッチファイルを使っている以上、簡単には回避できないようだ。

ネットワーク越しで使うとUNCパスの警告が出る。

コマンド引数として欲しいだけなのになぁ。

UNC パスはサポートされません。Windows ディレクトリを既定で使用します。