昨日のCABの圧縮方法をもう少し調べてみた。

不明なことばかりだ・・・

MakeCabで分かったこと

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は未確認)
  • Windows2000WindowsXPで 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