m2

ファイルコピーその2

前回 Javaでのファイルコピーについて書いたんだけど「いや、ただコピーするだけじゃなくて、なんてゆうか、Windows 上でコピーするみたいに、上書き確認したり、進捗ダイアログ出したりとか、したいなぁって。あとゴミ箱に入れたりとか。」という要望もきっと出てくるんじゃなかろうかと思って該当する winndows コマンドを探すも見つけられず。そもそもコマンドは CUI のものだからダイアログのような GUI を伴うコマンドなんて無いんだろうな。
java は多数のプラットフォームで動くように設計されているので、OS固有の機能などはサポートされない。なのでOS固有の動作をさせたいなら前回のようにその部分を自作することになる。
この場合は

  1. 上記機能を実装したネイティブライブラリを作成。それをJNIで実行。
  2. 上記機能を実装した exeファイルを作成。それを Runtime#exec で実行。

といった実装が考えられる。上書き確認したり進捗ダイアログ出したりなんかは「SHFileOperation」でやれるそうなので、誰か挑戦してみてください。(もし既にそういうライブラリがあれば是非紹介してください。*1
んで今回は VisualStudio とか入れるのめんどーだしもっとてっとりばやい方法ないかなーということで、VBScript で書いてみました。以下はファイルをフォルダにコピーするスクリプト
[wcopy.vbs]

Option Explicit
' --------------------------------------------------------------------------
' [usage] wcopy.vbs コピーするファイル(フォルダ) コピー先フォルダ
' --------------------------------------------------------------------------
' [概要]
' Windows のシェル機能を使ってファイルをフォルダにコピーします。
' 上書き確認・進捗ダイアログが表示されます。
' --------------------------------------------------------------------------
If WScript.Arguments.Count <> 2  Then 
    WScript.Echo "コマンドの構文が誤っています。"
    WScript.Quit
End If

Dim fromFile, toFolder
fromFile = WScript.Arguments.Item(0)
toFolder = WScript.Arguments.Item(1)

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
If ( Not fso.FileExists(fromFile) ) and ( Not fso.FolderExists(fromFile) ) Then
    WScript.Echo "コピー元のファイルが見つかりません。"
    WScript.Quit
End If
If Not fso.FolderExists(toFolder) Then
    WScript.Echo "コピー先のフォルダが見つかりません。"
    WScript.Quit
End If

Dim Sh
Set Sh = CreateObject("Shell.Application")
On Error Resume Next 'なんか上書き確認でキャンセルするとエラーがでるので。
                     'ただこれだとホントのエラーも無視されちゃうんだよな。
Sh.NameSpace(fso.GetAbsolutePathName(toFolder)).CopyHere(fso.GetAbsolutePathName(fromFile))

これを Runtime#exec() すればOK(だと思う。未検証)。あと古い windows だと動かないかも。

*1:見つけられなかったんですよ。