ファイルを圧縮(lzh形式やzip形式等)に変換するには?

解決


マグ  2004-06-16 04:31:12  No: 113940  IP: [192.*.*.*]

インターネットなどにある圧縮ソフトみたいのがありますけど

あのようにファイルをlzh形式やzip形式などに圧縮をかける
プログラムを組むにはどのように記述すればいいのでしょうか?
初心者なので、どうすればいいか分かりません。
お願いします。

編集    削除
マグ  2004-06-16 04:33:41  No: 113941  IP: [192.*.*.*]

言い忘れがありました。

VB.NETでお願いします。

編集    削除
魔界の仮面弁士  2004-06-16 08:10:16  No: 113942  IP: [192.*.*.*]

UNZIP32.DLL 等に頼らず、.NET Frameworkのみで行うなら、こんな感じですかね。

J#のvjslib.dllを参照設定しておいてください。

'「C:\A.TXT」と「C:\A.XLS」を圧縮した『C:\A.ZIP』を作るサンプル
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim outStream As New java.util.zip.ZipOutputStream(New java.io.FileOutputStream("C:\A.ZIP"))
    putFileToZip(outStream, "C:\A.TXT")
    putFileToZip(outStream, "C:\A.XLS")
    outStream.close()
End Sub

Private Sub putFileToZip(ByVal outStream As java.util.zip.ZipOutputStream, ByVal Path As String)
    Dim size As Integer = CInt(FileLen(Path))
    Dim inStream As New java.io.BufferedInputStream(New java.io.FileInputStream(Path))
    Dim crc As New java.util.zip.CRC32
    Dim buf(size - 1) As SByte
    If inStream.read(buf, 0, size) <> -1 Then
        crc.update(buf, 0, size)
        outStream.write(buf, 0, size)
    End If
    Dim entry As New java.util.zip.ZipEntry(System.IO.Path.GetFileName(Path))
    entry.setMethod(java.util.zip.ZipEntry.DEFLATED)
    entry.setSize(size)
    entry.setCrc(crc.getValue())
    outStream.putNextEntry(entry)
    inStream.close()
    outStream.closeEntry()
    outStream.flush()
End Sub

編集    削除
マグ  2004-06-16 21:42:21  No: 113943  IP: [192.*.*.*]

ZIPに圧縮するこは出来たんですけれど解凍ができません。
あと、圧縮した後にエラーが出ます。

圧縮できるのならば、関数とかAPI関数とかDirectXなどとどれでもいいです。
ついでにと言いたいのですが・・・
圧縮形式(なるべく全て)などにしたい場合はソースのどこを変えればいいか教えてください。
お願いします。

編集    削除
マグ  2004-06-16 21:44:51  No: 113944  IP: [192.*.*.*]

付け足し

>ZIPに圧縮するこは出来たんですけれど解凍ができません。
という所は解凍ソフトで解凍しようとした所エラーが発生して、解凍されませんでした。

圧縮形式ということが認識されていなっかたみたいな感じでした。

編集    削除
魔界の仮面弁士  2004-06-16 22:29:25  No: 113945  IP: [192.*.*.*]

> ZIPに圧縮するこは出来たんですけれど解凍ができません。
あれれ、こちらでは解凍できたのけれどね。何が違うのでしょう。
(CRCチェックも行ってみましたが、こちらでは問題無しと報告されました)

なお、こちらで解凍に使ったのは、
・Windows XPのエクスプローラ(圧縮フォルダ機能)
・ExpLzh 3.58 (ZIP32.DLL 2.30, UNZIP32.DLL 5.40)
・解凍レンジ 1.41
の3種ですが、いずれも問題なく展開されました。(WinXPで確認)

もしかしたら、更新日情報を指定していないのが原因かもしれません。
setTimeメソッドも使ってみてください。また、圧縮指定したファイルが、
本当に存在するかどうかなども確認してみてください。


> あと、圧縮した後にエラーが出ます。
この点に関しても、こちらではエラーが発生しないため、わかりません。

正直なところ、J#やJavaには詳しく無いため、修正を求められても、
どこを直すべきか、まったく検討が付いていなかったりします。すみません。


> 圧縮形式(なるべく全て)などにしたい場合はソースのどこを変えればいいか教えてください。
ソースの一部を変える程度では対応できません。

圧縮用の統一されたインターフェイスが.NETに用意されているわけでは
ありませんので、圧縮形式に応じて、全く異なるコードを書く必要があります。

また、圧縮アルゴリズムにはいろいろな種類の物があります。その中には、
アルゴリズム自体が一般公開されておらず、圧縮/展開用のDLLが市販されて
いたりするような物さえありますので、「全て」に対応させるのは、
事実上不可能かと思いますよ。個別に調べて、対応させていってください。

たとえば、Windowsで良く使われる *.cab 形式であれば、Microsoft から
Cabinet SDKと言う物が配布されていますので、そちらの資料を参考にして見てください。

あるいは、統合アーカイブプロジェクトによるDLLのうち、圧縮機能を持った
アーカイバDLL(UNLHA32.DLL等)を利用する事もできるかと思います。
なお、統合アーカイブに関しては有名なので、google等で検索すれば
VB.NETでの利用例も見つかりますので、ここでは説明を省きます。

それ以外の手法としては、「コマンドライン指定で動作するプログラム」(LHA.EXEなど)を
用意して、それを呼び出すというのも手かと思います。

編集    削除
魔界の仮面弁士  2004-06-16 22:33:22  No: 113946  IP: [192.*.*.*]

> あるいは、統合アーカイブプロジェクトによるDLLのうち、圧縮機能を持った
失礼。統合『アーカイバ』プロジェクトの間違いです。m(_ _)m
http://www.csdinc.co.jp/archiver/

編集    削除
マグ  2004-06-17 02:08:44  No: 113947  IP: [192.*.*.*]

ありがとうございました。
やっと解決しました。
原因はデスクトップ上でテキストファイルを作りCドラに送っていたから
メモ帳をダブルクリックで開くことが出来なくなっていたようです。
それが原因でZIP形式が失敗してたようです。

編集    削除
マグ  2004-06-17 02:10:35  No: 113948  IP: [192.*.*.*]

入力間違いしました。

>メモ帳をダブルクリックで
この部分は
テキストファイルダブルクリックで

です。

編集    削除
z  2004-06-17 03:21:56  No: 113949  IP: [192.*.*.*]

いまいちどういう風に解決したのかわかりませんが・・・

編集    削除