VB.NETからzipファイルを作成

解決


すー  2004-07-14 11:24:46  No: 114765

すーです。

早速ですが、標記の件についてご質問したいと思います。
VB.NETを使用して、圧縮ファイル(ZIP形式)を作成したいのですが、
よい情報が見つかりません。
方法としては

  1.- zip32j.dllなどを参照設定し、圧縮用のメソッドを呼び出す
  2.- shellからアーカイバのEXEを呼び出す

の二つがあると思いますが、私としては前者の方法で行いたいと考えています。
が、例えばもっとも有名であろうzip32j.dllやzip32.dllを参照設定しようとす
ると
「これは有効なアセンブリ、またはCOMコンポーネントではありません。」
怒られてしまいます。
また、J#付属のvjslib.dllを使う方法もあるようですが、
VB.NETのプロジェクトにJ#のクラスを使うのはどーも。。。
ICSharpCode.SharpZipLibというものも、参照設定してみたのですが、
使い方が理解できません(ーー;)

何か、よい方法がありましたらご教授願えませんでしょうか。

よろしくお願いします。

環境:
Win2000
VS.NET


魔界の仮面弁士  2004-07-14 18:43:56  No: 114766

> 「これは有効なアセンブリ、またはCOMコンポーネントではありません。」
zip32j.dllは、.NETアセンブリでもなければ、ActiveX DLLでもありませんので、
参照設定はできません。Declareステートメントで宣言してください。


マグ  2004-07-14 22:50:49  No: 114767

まず、「参照の追加」で「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

こんな感じでしょうか?
ちなみにこのソースはVB.NET用のソースです。

確かにどんなに探しても、圧縮や解凍させるソースってありませんよね。
あと、できれば、上のソース以外に圧縮や解凍をさせるソースを知っている方がいるならば、
教えてください。
お願いします。


マグ  2004-07-14 22:59:29  No: 114768

今、気がついたけど・・・
すーさんが書いてる環境って見たことがないのが書かれています。


Dental  2004-07-15 00:39:57  No: 114769

> まず、「参照の追加」で「vjslib.dll」を追加します。

今回は、その方法を使えないみたいですよ。>マグさん

元質問者(すーさん)の方の前提条件として、
>> また、J#付属のvjslib.dllを使う方法もあるようですが、
>> VB.NETのプロジェクトにJ#のクラスを使うのはどーも。。。
と書かれているわけですし。

> 確かにどんなに探しても、圧縮や解凍させるソースってありませんよね。
統合アーカイバプロジェクト製DLLを使ったサンプルなら、そこそこ見つかりますよね。

> あと、できれば、上のソース以外に圧縮や解凍をさせるソースを知っている方がいるならば、
> 教えてください。
マグさん、同じ内容の質問に便乗する、というならばまだしも、
人が質問しているところに割り込んで、別の質問をするというのは
いかがな物かと思いますよ。。。

まぁ、幾つかの圧縮方式は、アルゴリズムが公開されているのですから、
それらを自力実装すれば、実現できますよね。例えばLHAであれば、
http://homepage1.nifty.com/dangan/Content/Program/Java/jLHA/Notes/CompressMethod.html
とか。

付きつめれば、ランレングス法とかハフマン法とかを学んで、
それらを使った「独自の圧縮方法」を実装する事もできるでしょうし。
http://www.ann.hi-ho.ne.jp/jiro/assyuku2.htm

> すーさんが書いてる環境って
Edition の違いも含めれば、いろいろな受け取り方があるでしょうが、自分は
  Windows 2000 Professional + Visual Studio.NET 2002
だと判断しました。

> 見たことがないのが書かれています。
そうですか? さほど珍しい組み合わせというわけでも無いような。


マグ  2004-07-15 01:35:09  No: 114770

>元質問者(すーさん)の方の前提条件として、
>>> また、J#付属のvjslib.dllを使う方法もあるようですが、
>>> VB.NETのプロジェクトにJ#のクラスを使うのはどーも。。。
>と書かれているわけですし。

気がつきませんでした。

>統合アーカイバプロジェクト製DLLを使ったサンプルなら、そこそこ見つかりますよね。

それも見つからないんです。(TT)

>マグさん、同じ内容の質問に便乗する、というならばまだしも、
>人が質問しているところに割り込んで、別の質問をするというのは
>いかがな物かと思いますよ。。。

内容は圧縮系に入るので結果的には同じような質問のような気がするのですけど、
もしかして、ぜんぜん、違いますか・・・?

>そうですか? さほど珍しい組み合わせというわけでも無いような。
よく見ると、VS.NETとか書かれているんですが・・・
Bの部分がSになっています。


nanashi  2004-07-15 02:02:38  No: 114771

> よく見ると、VS.NETとか書かれているんですが・・・
> Bの部分がSになっています。

Visual Studio.NETのことです。
別に普通です。


すー  2004-07-15 07:13:46  No: 114772

すーです。

>zip32j.dllは、.NETアセンブリでもなければ、ActiveX DLLでもありませんので、
>参照設定はできません。Declareステートメントで宣言してください。
魔界の仮面弁士さん、ありがとうございます。
APIを使う方法で、実装可能でしたので、今回はそれでやる事にします。
http://www.geocities.co.jp/SiliconValley-SanJose/1892/pc/archive.html
にありました。
単純に今回は圧縮するだけでよいので、

==============================
Public Declare Function Zip Lib "Zip32j" _
              (ByVal hWnd As Integer,_
              ByVal szCmdLine As String,_
              ByVal szOutPut As String,_
              ByVal dwsize As Integer) As Integer
==============================
を宣言して、使います。

マグさん、今回はJ#は使用できないので、せっかくコードを書いていただいたのに、
申し訳ありません。でも、いつか使うかもしれないので、参考にさせていただきます。

使用環境はDental さんのおっしゃるとおり、
Windows 2000 Professional + Visual Studio.NET 2002のVB.NET
です。記述が雑でした。すいません。

アルゴリズムも、見るには見ましたが、文系でそもそも数学がまったくもってできないため、
自力での実装は勉強して出来るようなレベルではありません。。。
今回の要件は、大まかに説明すると
DBサーバ⇒「SQLServer」⇒DTS⇒「MDB」⇒圧縮(ZIP)⇒「ZIP」⇒FTPでWWWサーバに転送⇒ユーザがDL
というものでしたので、独自形式などは使用できません。
また、そこまでの工数も割く必要のない機能ですので。

可能ならば、すべての処理をEXEで完結したかったのですが、時間と知識量の問題で
MDBファイルは空の物を用意しておき、DTSはDTSRUNというツールを使用する事になりました。

しかし、作ったEXEからファイル圧縮を行いたいと言う要件が、あまりないのか、
サンプルが見つけにくいのは確かでした。
.NET対応の(ActiveXの?)DLLはないのでしょうかね??
それであれば、もうちょっとスマートなんでしょうが。
引き続き探して見ます。

思いっきり、長々と書いてしまいましたが、皆さんありがとうございました。
以上です。


すー  2004-07-15 07:14:49  No: 114773

すいません、解決済みです。


Dental  2004-07-15 19:31:38  No: 114774

[マグさん]
>> 統合アーカイバプロジェクト製DLLを使ったサンプルなら、そこそこ見つかりますよね。
> それも見つからないんです。(TT)
すーさんが紹介してくださったページ以外にも、
http://dobon.net/vb/dotnet/links/extractarchive.html
とか。

> 内容は圧縮系に入るので結果的には同じような質問のような気がするのですけど、
> もしかして、ぜんぜん、違いますか・・・?
「圧縮系」で括るのは、少々乱暴なように感じました。
今回はZIP圧縮に限定した質問だったわけですし。

それに、他の人が投げた質問スレッドに、追加で質問を投げてしまうと、
元質問者の方が『解決』マークを付けた後にも、話が続く可能性が
あるわけですから、話の流れが分かりにくくなってしまうと思います。
そうした意味で、便乗質問は極力、避けた方が無難かと思いますよ。
(掲示板によっては、便乗質問を明示的に禁止しているところもあります)

# 上記発言は、便乗を禁止しているわけではなく、便乗しない方が良いと思う、という個人的な意見です。
# (そうしたルールを決める事ができるのは、この掲示板の管理者だけでしょうし)

> よく見ると、VS.NETとか書かれているんですが・・・
nanashiさんも書かれていますが、VS.NETというのは VB.NETの
書き間違いではなく、Visual Studio.NET という製品の略名ですよ。

[すーさん]
> DBサーバ⇒「SQLServer」⇒DTS⇒「MDB」⇒圧縮(ZIP)⇒「ZIP」⇒FTPでWWWサーバに転送⇒ユーザがDL
> というものでしたので、独自形式などは使用できません。
> また、そこまでの工数も割く必要のない機能ですので。
個人利用ではなく、業務利用なのですか?

UNZIP32.DLLは、個人利用ではフリーソフト(寄付歓迎)という扱いですが、
企業内での使用やパッケージソフトへの同梱等の商用使用に関しては、
原則的にライセンス契約が必要です。
(企業の営利活動に関わる業務は、直接間接は問わずすべて商用です)

もし、ライセンス契約を結んでいないのであれば、事前に 
shoda@csdinc.co.jp に連絡する必要がありますよ。

> .NET対応の(ActiveXの?)DLLはないのでしょうかね??
皆無では無いですよね。例えば、最初の質問にあった、
「ICSharpCode.SharpZipLib」
http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
も、.NETアセンブリとして公開されているわけですし。

…と言っても、私は SharpZipLib を使った事がありませんが。(^_^;)

> ICSharpCode.SharpZipLibというものも、参照設定してみたのですが、
> 使い方が理解できません(ーー;)
[Source code and samples] に付属の viewzipfile の
サンプルさえも動かなかったのでしょうか?


マグ  2004-07-15 20:47:52  No: 114775

>Visual Studio.NETのことです。
>別に普通です。

なるほど 気がつきませんでした。
>すーさんが紹介してくださったページ以外にも、
>ttp://dobon.net/vb/dotnet/links/extractarchive.html
>とか

実はこのサイトは何ヶ月か前に入ったことがありまして、
最後のVB.NETのソースでなぜか出来なかったんです。(TT)


すー  2004-07-16 10:49:39  No: 114776

⇒Dental さん
今回使用するのはZIP32.DLLなので、問題はないかと。圧縮のみなので。
もう一度きちんと調べて見ます。
だめなら、lzhしかないなー。。。
基本的に、不特定多数のユーザに圧縮ファイルをDLさせる場合、
マイナーな形式を使うわけにはいかないですからね。
”[Source code and samples] に付属の viewzipfile ”というのは、
気がつきませんでした。調べてみます。

使えたら、又お知らせします。

⇒マグさん
”最後のVB.NETのソースでなぜか出来なかったんです。”
zip32j.dllを使用するためには、zip32.dllも必要です。
declareで宣言してやれば、使えるはずです。
hWndにはNothigを指定しましょう。


マグ  2004-07-16 19:06:19  No: 114777

ありがとうございました。

調べてみます。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加