Hatena::ブログ(Diary)

m2

2006-12-20

自己解凍形式の圧縮ファイルは実行せずに普段使っている解凍ソフトで解凍してください

自己解凍書庫の拡張子は「exe」なので解凍ソフトを使うという発想が無かったりしないでしょうか? 自己解凍形式とはいえただの圧縮ファイルですので*1、普段使っている解凍ソフトで解凍することが出来ます。解凍できない場合はウィルスと思って間違いないでしょう。
たったこれだけのことで圧縮ファイルを装ったウィルス感染を防げますから、必ずそうしてください。

なんで急にこんなことを言うかというと、自分がど素人だった頃を思い出して今更ながら寒気がしたからでした。

*1:自己解凍書庫は例えば http://www.ponsoftware.com/archiver/others/software.htm の deczip.exe だと「copy /b deczip.exe + xxx.zip newsfx.exe」で作れます。

2006-12-11

ファイルコピーその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:見つけられなかったんですよ。