質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5984閲覧

7-Zipでの解凍

BeatStar

総合スコア4958

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/01/02 02:57

私が思っていたのは、

そっくりそのままzipファイル化 & そっくりそのまま解凍

です。

たとえば、

Cドライブ直下に "abc" ディレクトリがあり、そのディレクトリには

  • ファイル1.gif
  • ファイル2.jpg
  • ファイル3.png
  • ファイル4.bmp
  • ファイル5.html
  • "info" ディレクトリ ( サブディレクトリ )

があり、 "info" ディレクトリには

  • burner.jpg
  • ファイル6.css
  • ファイル7.css

とあるとします。

これをそっくりそのまま zip化して、解凍した場合でも同じような階層にしたいのです。

ですが、私のやり方が悪いのか 7-Zipでやると

解凍すると

一つのディレクトリに

  • ファイル1.gif
  • ファイル2.jpg
  • ファイル3.png
  • ファイル4.bmp
  • ファイル5.html
  • burner.jpg
  • ファイル6.css
  • ファイル7.css

とサブディレクトリ以降のファイルもすべて一つの階層に集まっています。

圧縮は、WindowsのExplorerで

右クリック -> "送る" -> "圧縮(zip形式)フォルダ"

でやって、以下の CCompressor::Unpack関数 で解凍してみました。

C++

1// 必要なヘッダファイル等はインクルード済みとする。 2 3 4 5// CCompressorクラスという自作クラスのメンバとして。 6 7// string CompressedFilePath はメンバ変数。コンストラクタですでに受け取っているとする。 8 9bool CCompressor::Unpack( char *ToDir ){ 10 string cmd; 11 12 char result[1000]; 13 14 cmd = "e "; 15 cmd += this->CompressedFilePath; 16 cmd += " "; 17 if( ToDir != NULL ){ 18 cmd += " -o"; 19 cmd += ToDir; 20 } 21 cmd += " -hide"; 22 if( this->PassWord.empty() != true ){ 23 cmd += " -p"; 24 cmd += PassWord; 25 } 26 27 28 if( SevenZip( NULL, cmd.c_str(), result, 1000 ) == 0 ){ 29 return true; 30 }else{ 31 return false; 32 } 33}
  • 第二引数は
    e ZIPFILE -hide ( -o DIRECTORY ) ( -pPASSWORD )

としています。

これって7-Zipの仕様なのでしょうか?

それとも方法があるのでしょうか?

[環境等]
言語 : C/C++
コンパイラ : MinGW
別途 使うDLL: 7-Zip32.dll

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下 7-zipCMD.txt に記載のとおり、e(解凍)ではなくx(フルパスで解凍) コマンドを利用すべきのようです。

e : 解凍
 ̄ ̄ ̄ ̄
書庫からファイルをカレントディレクトリ、
又は指定のディレクトリに解凍します。
解凍先ディレクトリを指定するには -o スイッチで指定してください。

このコマンドは一つのディレクトリにファイルを全て解凍します。 ディレクトリ付きで解凍する場合は x コマンドを使用してください。

投稿2017/01/18 01:00

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

-r (Recurse subdirectories) switch
Specifies the method of treating wildcards and filenames on the command line.

Syntax
-r[- | 0]

Switch Description
-r Enable recurse subdirectories.
-r- Disable recurse subdirectories. **This option is default for all commands. **
-r0 Enable recurse subdirectories only for wildcard names.


これが影響しているように思えました。'-r'を指定して試してみてはいかがでしょう。

投稿2017/01/02 04:07

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2017/01/17 04:16

ご回答ありがとうございます。 std::string に入れて やってみたのですが、同じ結果でした。 "-r" の位置を入れ替えて何度も試してみましたが、同じでした。 どうすればいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問