複数ファイルを zip して unzip したい

[戻る]
なおぞう 2016/01/27(水) 16:28:53
専属利用してしまっていて恥ずかしい&心苦しいのですが、アドバイスをお願いします。
VS2013 VC++ スタティックMFC利用 ランタイムサポート利用しない
Win32コンソールアプリで 開発中です。

先日投稿したcompress,uncompressに重複した質問になりますがcompress,uncompressで 
複数のファイルを指定してアーカイブするのが難しいと判断し、それ以外の(xlib内の関
数)での実現方法が無いかとお知恵を戴きたく投稿させていただいております。

【zlibを使って実現したい事】
@圧縮
既定フォルダに出力した複数ファイルをまとめて、zipファイルにする(アーカイブ出来
れば何でも良いと考えています)

A解凍
指定したフォルダに、アーカイブ内のファイルが解凍されて保存されること。
(アーカイブファイル名のフォルダは作らないで、指定フォルダに直にファイルが格納さ
れること)


また、下記サイトを参考にして、
http://hp.vector.co.jp/authors/VA016379/cpplib/zlib.htm
とりあえずUnzipからでも作ってみようと考え、記載されている通りにしてみたのです
が、記載してあるunzip.libがDLしてきたフォルダ内のどこにも見当たらない(zip.libも
必要になりそうだけど同じく見当たらない)状態で、サンプルを実現させることもできて
いない状態です。
この件に関してもアドバイスをいただけると助かります。

よろしくお願いします。

みい 2016/01/27(水) 16:48:33
サイト前半の「zlibのビルド(zlib.libの作成)」
に書いていますが、自分でビルドして作らないと
いけないようです。

なおぞう 2016/01/27(水) 17:17:31
>みい様

ご返答ありがとうございます。

『c:\zlib\debugもしくはc:\zlib\releaseのなかにzlib.libができていると思います。』
に関しては書いてある通りにコンパイルして作成できました。

その後の
、
『以下のファイルを組み込みたいプログラムのディレクトリにコピーします。
c:\zlib\contrib\minizip\unzip.h
c:\zlib\contrib\minizip\unzip.c
c:\zlib\zconf.h
c:\zlib\zlib.h
これ------>>>>>c:\zlib\debug\unzip.lib もしくは c:\zlib\release\unzip.lib
zip.cpp
zip.h』

unzip.lib が 無いのです。これが有ればUnzip()関数が使えるんだろうなぁって漠然と
考えています。
同様に、zip.libがあればZip()関数があるのだろうと。
ですが、このlibの中に入っているであろう関数が 複数ファイルの圧縮・解凍に対応し
ていなければ意味がないのですが…。

みい 2016/01/27(水) 17:47:20
おそらく記述ミスだと思います。
『c:\zlib\debugもしくはc:\zlib\releaseのなかにzlib.libができていると思います。』
に対して
『c:\zlib\debug\unzip.lib もしくは c:\zlib\release\unzip.lib』
ですから(上記で作成したzlib.libがファイルの一覧にはない)。

みい 2016/01/27(水) 17:57:48
「zip.cpp」の中を見てください。
#pragma comment(lib, "zlib.lib")
となっています。
→「unzip.lib」ではなく「zlib.lib」が正解

なおぞう 2016/01/27(水) 18:05:01
>みい様

unzip.libは誤字でzlib.libが正しいという事ですか?
それを前提として、zlib.libを開発しているプログラムのディレクトリ―にコピーしまし
た。他、必要なc,hも一緒にコピーして、該当するCはプロジェクトへ追加。
書かれているもの以外のh、cもエラーがでたのでコピーして何とかコンパイルを通しま
した。
その結果、zlib.hに宣言されている関数(compress()やuncompress())は呼べますが、そ
れ以外は当然呼べません。
期待していたUnzip()やZip()という関数はzlib.hには用意されていないようなのです。

というのが現状です。

【zlib.h内で宣言されている関数一覧
http://dencha.ojaru.jp/programs/pg_filer_04_extra_01.html

みい 2016/01/27(水) 18:10:41
同じく「zip.cpp」
Unzip()関数はこの中に記述があります。
Unzip関数の中でunzGoToNextFileを使って処理を回してますので
複数ファイル対応です。

圧縮は
「c:\zlib\contrib\minizip\zip.c」
「c:\zlib\contrib\minizip\zip.h」
内の関数を使ってUnzip()関数のように処理関数を作成する必要
があります。

みい 2016/01/27(水) 18:12:11
http://hp.vector.co.jp/authors/VA016379/cpplib/zlib.htm
のサイト内の
zip.cpp
zip.h
をクリックして下さい。
ファイルに飛びます。

みい 2016/01/27(水) 18:22:14
この2つのファイルだけフルパスで書かれていない
かつリンクになっていることを見落とされています。

サイトに「解凍」と書かれている通り上記のzip.cppは『解凍』のみです。
圧縮用のファイル追加及び関数記述は別途行う必要があります。
圧縮には
「c:\zlib\contrib\minizip\zip.c」
「c:\zlib\contrib\minizip\zip.h」
が必要なので、圧縮まで考えると「zip.cpp」「zip.h」は
別のファイル名にした方がよいです。

なおぞう 2016/01/27(水) 18:22:53
>みい様

ありがとうございます。
ソースがリンクされていたのに気が付いていなかったです。
zip.cpp,zip.hの代わりに、C:\zlib\zlib0127\contrib\minizip\zip.c,zip.hをコピーし
て使っていました……Unzip関数が有るわけないですよね。
それにしても、なぜUnzipだけなのか。
対でZipも用意してくれていたら有難かったのですが。私の頭でZip()と同じ処理が作れる
かどうか。Unzipの逆って考えれば出来るでしょうか。

何か良い参考サイトがあったらまた紹介していただけると嬉しいです。

なおぞう 2016/01/27(水) 20:26:31
>みい様
教えていただいた通りに環境を整えてUnzip()を実行してみました。
ちゃんと動きました。
感動…!(ここまで長かったので)
でも、Zipが本命ですので引き続き頑張ります。

なおぞう 2016/01/28(木) 19:47:45
[[解決]]
その後、
http://see-ku.com/sklib/08.skzipio/index.html
というサイトで複数ファイル圧縮、解凍可能なラッパを見つけました。
VC++6.0なので、これをVS2013に変更して使う事になりました。
普通に変換でも文字関係でいろいろありそうなのですが、

@共通DLLでMFCを使う→スタティックライブラリでMFCを使う
Aマルチバイト文字→Unicode文字

に変更しているのでとんでもない状態です。

一つ目のエラー
「Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll
version. Please #define _AFXDLL or do not use /MD[d]」
から何をどうしたらよいのかわからない状態です。

別問題になってしまったので、この質問はクローズ致します。
ありがとうございました。

AR 2016/01/31(日) 12:25:00
 エラーは、多分この辺りの問題なんだろうなと思いますので、こちらのURLを紹介して
おきます。
http://www.g-ishihara.com/mfc_ge_01.htm

 ただ、VC6のコードの時代からzipの仕様そのものが変わっています。
 例えば、書庫内のファイル名の文字コードがUNICODEとかUTF8になったりとか、Delta64
対応とかです。
 分かりやすいところで言えば、Windows Vista以降、エクスプローラーで4GB以上のファ
イルを圧縮するとZIP64形式になっちゃいます。
 (うろ覚えですが、圧縮前ファイル上限4GB、Zipファイルサイズ2GBの壁が取り払われ
たという話)

 正直なところ私も全体像を把握してないので細かいアドバイスはできませんが、素直に
7-zip32.dllあたりを使った方が良いのではないかと思います。

なおぞう 2016/02/01(月) 19:18:31
>ARさま

書き込みありがとうございます。
Building MFC application with /MD[d] 
に関しては解決しました。

プロパティ→C/C++→コード生成 
ランタイムライブラリを
マルチスレッド デバッグDLL(/MDd) 動的になっているのを
マルチスレッド デバッグDLL(MTd)  静的に変更することによって解決しました。

文字型は本当に難しくて、エラーの出ているところをキャストするっていう単純な考えで
はだめなので根本的理解をしていないので終わりが見えない状態です。

古いスレッドには追加発言できません。