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

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

ただいまの
回答率

90.48%

  • C++

    4504questions

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

7-Zipでの解凍

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,950

BeatStar

score 1347

私が思っていたのは、

そっくりそのまま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関数 で解凍してみました。

// 必要なヘッダファイル等はインクルード済みとする。



// CCompressorクラスという自作クラスのメンバとして。

// string CompressedFilePath はメンバ変数。コンストラクタですでに受け取っているとする。

bool CCompressor::Unpack( char *ToDir ){
            string cmd;

            char result[1000];

                       cmd = "e ";
                       cmd += this->CompressedFilePath;
                       cmd += " ";
                       if( ToDir != NULL ){
                            cmd += " -o";
                            cmd += ToDir;
                       }
                       cmd += " -hide";
                       if( this->PassWord.empty() != true ){
                            cmd += " -p";
                            cmd += PassWord;
                       }


            if( SevenZip( NULL, cmd.c_str(), result, 1000 ) == 0 ){
                   return true;
            }else{
                   return false;
            }
}
  • 第二引数は
    e ZIPFILE -hide ( -o DIRECTORY ) ( -pPASSWORD )

としています。

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

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

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

宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

e : 解凍
 ̄ ̄ ̄ ̄
    書庫からファイルをカレントディレクトリ、
    又は指定のディレクトリに解凍します。
    解凍先ディレクトリを指定するには -o スイッチで指定してください。
       このコマンドは一つのディレクトリにファイルを全て解凍します。
     ディレクトリ付きで解凍する場合は x コマンドを使用してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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/17 13:16

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

    std::string に入れて やってみたのですが、同じ結果でした。

    "-r" の位置を入れ替えて何度も試してみましたが、同じでした。


    どうすればいいのでしょうか?

    キャンセル

同じタグがついた質問を見る

  • C++

    4504questions

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