DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ZIP書庫作成について

環境/言語:[XP VB2005 Framewrok 2.0]
分類:[.NET]

こんにちは。

指定したフォルダ内のファイルをパスワード付きzipファイルに圧縮しようとしています。
統合アーカイバプロジェクトサイト
http://www.madobe.net/archiver/index.html
を参考に作成していますが、下記のコードの下したの方で、エラーがでてしまうのですが、どう直せばよいか途方にくれています。

■エラーメッセージ
「'System.AccessViolationException' の初回例外が test.exe で発生しました。
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」

どこが悪いのかご教授願います。

〜中略〜

Public Declare Function Zip Lib "Zip32j" ( _
ByVal hWnd As Long, _
ByVal szCmdLine As String, _
ByVal szOutPut As String, _
ByVal dwsize As Long _
) As Long

〜中略〜

'C:\test\aaaを C:\test\bbb.zip に圧縮する
Dim tStr As String = "-r C:\test\aaa C:\test\bbb.zip"
Dim ret As Long = Zip(0, tStr , Nothing, 0)
↑ここでエラーになる

ちなみに、
Public Declare Function ZipGetVersion Lib "Zip32j" () As Integer
を定義して、
Dim ver As Integer = ZipGetVersion()
Console.WriteLine("バージョン:{0}", ver)
を実行すると、バージョンが表示されているので、Zip32j.dllにはアクセスしてると思います。
> Public Declare Function Zip Lib "Zip32j" ( _
> ByVal hWnd As Long, _
> ByVal szCmdLine As String, _
> ByVal szOutPut As String, _
> ByVal dwsize As Long _
> ) As Long

型のマッピングがめちゃくちゃですね。
http://uchukamen.com/Programming/Interop/index.htm
ここなど参考に、API の型に対応する .NET 型を正しく指定してください。
返信ありがとうございます。
ずいぶんと調べたのですが、
APIの型ですが、hWnd の部分の型が分からず、
下記のようにしてみたのですが、
やはりうまくいきません。

Public Declare Function Zip Lib "Zip32j" ( _
ByVal hWnd As Int64, _
ByVal szCmdLine As String, _
ByVal szOutPut As String, _
ByVal dwsize As UInt32 _
) As Int32
■No15141に返信(fn32さんの記事)
> APIの型ですが、hWnd の部分の型が分からず、
> 下記のようにしてみたのですが、
> やはりうまくいきません。

System.IntPtr。

詳しくは、
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html

................................................................................................
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
2006/03/31(Fri) 22:38:57 編集(投稿者)
2006/03/31(Fri) 20:49:04 編集(投稿者)

■No15142に返信(じゃんぬねっとさんの記事)
できました。ありがとうございます。
参考までに、コードをアップしておきます。

Public Declare Function Zip Lib "Zip32j" ( _
  ByVal hWnd As System.IntPtr, _
  ByVal szCmdLine As String, _
  ByVal szOutPut As String, _
  ByVal dwsize As UInt32 _
) As Int32
〜中略〜
  Dim ret As Long = Zip(System.IntPtr.Zero,_
"-r C:\test\bbb.zip C:\test\ccc.txt", Nothing, 0)

しかしながら、今度は、szCmdLine のコマンドの設定でつまづいています。
「指定したフォルダ内のファイルをパスワード付きzipファイルに圧縮」
する設定が分かる方は、教えてください。
LHA,ZIPのCOMMAND.TXT等読みましたが、理解できませんでした。
質問内容が、.NET関連ではないので、しばらくしたら、このスレッドは閉じます。
別のところで質問することにしました。
ありがとうございました。
解決済み!
> 別のところで質問することにしました。

マルチポストになる危険性がありますので、お手数ですが、どこで質問したのか、ご報告をお願いいたします。

なお、.NETでのZIP圧縮については、私のサイトで解説しています。また、.NET 2.0では、GZipStreamクラスが使えるようです(パスワードが設定できるかは分かりません)。

DOBON.NET .NET Tips - ZIP書庫の作成、閲覧、展開を行う
http://dobon.net/vb/dotnet/links/createzipfile.html
■No15154に返信(管理人さんの記事)
> マルチポストになる危険性がありますので、お手数ですが、どこで質問したのか、ご報告をお願いいたします。
>

実は、LHA,ZIPのCOMMAND.TXT等を読み、自分で解決しました。
参考に、c:\test\aaa\bbb\ccc をフォルダ毎圧縮し、パスワード12345 を設定して、ddd.zipに圧縮するコマンドは、
"-r C:\test\ddd.zip C:\test\bbb\ C:\test\aaa\bbb\ccc\ -P 12345"
でした。

> なお、.NETでのZIP圧縮については、私のサイトで解説しています。また、.NET 2.0では、GZipStreamクラスが使えるようです(パスワードが設定できるかは分かりません)。
>
> DOBON.NET .NET Tips - ZIP書庫の作成、閲覧、展開を行う
> http://dobon.net/vb/dotnet/links/createzipfile.html
>
そうなんです。このページにも挑戦したのですが、どうもパスワード設定までできなそうなので、ほかの圧縮形式にも対応できるように、上記のような方法を勉強していました。

ご情報ありがとうございました。
解決済み!
> そうなんです。このページにも挑戦したのですが、どうもパスワード設定までできなそうなので、ほかの圧縮形式にも対応できるように、上記のような方法を勉強していました。

やはり、パスワードは設定できませんでしたか。#ziplibは確かパスワードが設定できると思ったのですが。
解決済み!
> なお、.NETでのZIP圧縮については、私のサイトで解説していま
> す。また、.NET 2.0では、GZipStreamクラスが使えるようです
> (パスワードが設定できるかは分かりません)。

GZipStreamクラスはZIP圧縮をサポートするものではなく、GZIP圧縮なので
今回の処理には使えないでしょうね。
いわゆるTAR/GZIP形式というやつですが、TAR形式は自分で別途作成する必要
があります。

ZIPで使われている圧縮方式をサポートするのはDeflateStreamクラスですが
これも圧縮方式をサポートしているだけなので、ZIP形式のファイルとして
作成するには、ZIPファイルの内部構造を自分で作成してあげなくてはいけません。

なおかつ、GZipStream/DeflateStreamクラス共に圧縮率は高くないというか、
どうも圧縮しているはずなのに圧縮前のファイルよりも大きくなることがあり
ます。もしかするとバグなのかもしれませんが。

ということで、パスワードを掛けるにしても自分でやらなくてはいけませんし
DeflateStreamクラスではfn32さんの望むやり方は得られないかもしれません。

余談ですが、以前私が使ったときは解凍だけでしたので、TAR/GZIP形式を
事前にtar32.dllを使用して作成しておいて、実行時にはGZipStreamクラスで
解凍、TAR形式を自分で解釈するという形をとりました。
解決済み!
2006/04/04(Tue) 03:57:18 編集(投稿者)

#ログが壊れて2重投稿のようになっていたのを直しました。

GZipStreamに関するご報告、ありがとうございました。しかし、くどいようですが、#ziplibではできたと思ったのですが、こちらも駄目だったということでしょうか?
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板