昨日のCABの圧縮方法をもう少し調べてみた。
不明なことばかりだ・・・
MakeCabで分かったこと
- MakeCab.exeではディレクトリ構造が再現されない。
makecab /F FileList.txt
FileList.txtは圧縮するファイル名を記述したファイル。
c:\test1.txt c:\dir\test2.txt
これで圧縮すると、ディレクトリ部分が取れてtest1.txtとtest2.txtが同じ階層に圧縮される。
また、ファイル名が同じで違うディレクトリに入っているファイルを指定すると
c:\test1.txt c:\dir\test1.txt
ファイルが重複しているため圧縮できないというエラーになる。
使えなさすぎ・・・orz
CreateObject("MakeCab.MakeCab.1")で分かったこと
- CreateObject("MakeCab.MakeCab.1")を使えるのはWindow2000とWindowsXP(2003は未確認)
- Windows2000とWindowsXPで cab.CreateCab の引数の数が違う
public virtual void CreateCab ( System.Object CabFileName , System.Object MakeSignable , System.Object ExtraSpace , System.Object Use10Format )
Window2000では3つ
WindowXPでは4つ
最後の Use10Format の有無
MakeCab.MakeCab.1・・・何のためのバージョン1指定なんだろう?
わかんないこと
Cabファイルが削除される・・・-cab.CreateCab の2つ目以降の引数
- cab.CopyFile
cab.CopyFile ( System.Object CabName , System.Object FileNameInCab )
1つ目の引数にCabファイル名、2つ目の引数にカレントディレクトリに存在するファイル名を渡すと
適当なファイル名だと、不明なエラーが発生
圧縮するためのソース
Window2000、WindowsXP共に使用できるソースは次のようにすればいいのだそうだ
http://groups.google.com/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&c2coff=1&selm=Oqs%24H3ioCHA.1636%40TK2MSFTNGP09
のソースをちょこっと修正
'Cabpath:保存するCabファイル名 'fil:ファイル名を渡す。圧縮したいファイルがひとつの場合は、そのまま文字列を ' 圧縮したいファイル名が複数の場合は、文字列の配列を渡す ' 使い方 ' MakeCabFile( "test.cab", split("file1.txt|file2.txt","|") ) Sub MakeCabFile( Cabpath, fil) Dim cab, i On Error Resume Next ' We turn on error control because different versions of catsrvut.dll ' take different numbers of non-optional arguments. ' An XP version (numbered 2001.12.4414.46) needs 4 arguments; ' A Win2K SP2 version (2000.2.3488.0) takes 3 arguments only Set cab = CreateObject("MakeCab.MakeCab.1") ' The Methods of catsrvut seem to be finicky about argument types as well ' they tend to throw errors if we don't explicitly coerce the paths to ' strings before sending. cab.CreateCab CStr(Cabpath), False, False If Err.Number<>0 Then If Err.Number = 450 Then cab.CreateCab CStr( cabpath ), False, False, False Else Exit Sub End If End If On Error Goto 0 ' following allows simple calls to the function; the files argument ' can be supplied as a single string for one file or as an array for ' multiple files. ' This also If IsArray(fil) Then for i = 0 to Ubound(fil) '下のコメントした行がオリジナルだが、Cabファイルに保存する際にパスを削除しており 'Cabファイルから復元した際に、ディレクトリ構造が再現されない。 'そのため、第2引数にフルパスを渡すように修正。 ' cab.AddFile CStr( Trim(fil(i)) ), CStr( Mid(fil(i), InStrRev(fil(i), "\")+1) ) cab.AddFile CStr( Trim(fil(i)) ), CStr( Trim(fil(i)) ) next Else ' cab.AddFile CStr( fil ), CStr( Mid(fil, InStrRev(fil, "\")+1) ) cab.AddFile CStr( fil ), CStr( fil ) end if cab.CloseCab End Sub