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

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

ただいまの
回答率

90.34%

  • C

    4007questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3791questions

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

  • Win32 API

    247questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

7-Zipでのファイルリスト

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 973

BeatStar

score 1073

C/C++ でやっています。

7-Zip32.dll というもので zipファイルを解凍したりファイルを圧縮してzipファイルにしたり... と圧縮関連の操作するクラスを作成
しています。

以前質問したものは 解凍についてで、今回は リストについてです。

リストといっても std::list や リスト構造 ではなく、ファイルリストです。

SevenZip関数 ( 7-Zip32.dll にある関数 ) の第二引数を

"l 圧縮ファイル -r"

とした場合に 第三引数に格納されるデータです。

文字列は std::string を使って、

cmd = string("l ") + compressedFilePath + string(" -r");

としています。

動かしてみると、

7-Zip (a) 9.22 beta  Copyright (c) 1999-2011 Igor Pavlov  2011-04-18

Listing archive: abc.exe

--
Path = abc.exe
Type = 7z
Method = LZMA BCJ
Solid = +
Blocks = 2
Physical Size = 1107915
Headers Size = 1012
Offset = 191488

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2016-09-24 23:32:26 ....A         8496        29803  make\ab\BackgroundImages\black - コピー.jpg
2016-04-12 20:12:32 ....A         8493               make\ab\BackgroundImages\black.jpg
2016-09-24 19:28:16 ....A         8493               make\ab\BackgroundImages\glay.jpg
2016-10-03 16:56:10 ....A         8496               make\ab\BackgroundImages\purple.jpg
2016-07-02 22:30:42 ....A     10416054               make\ab\BackgroundImages\Blue.bmp
2016-04-07 20:43:58 ....A     10416054               make\ab\BackgroundImages\Pink.bmp
2016-04-07 20:27:46 ....A     10416054               make\ab\BackgroundImages\Red.bmp
2016-05-24 19:07:00 ....A          954               make\ab\ckw\ckw.cfg
2016-06-23 15:37:58 ....A         9885               make\ab\data\Excel2007.xlsx
2017-01-25 16:34:29 D....            0            0  make\ab\BackgroundImages
2017-01-25 16:34:29 D....            0            0  make\ab
2017-01-25 16:34:29 D....            0            0  make
------------------- ----- ------------ ------------  ------------------------
                              49660116      1106903  35 files, 5 folders

のようになります。

私が欲しいデータは、

make\ab\BackgroundImages\black - コピー.jpg
make\ab\BackgroundImages\black.jpg
make\ab\BackgroundImages\glay.jpg
make\ab\BackgroundImages\purple.jpg
make\ab\BackgroundImages\Blue.bmp
make\ab\BackgroundImages\Pink.bmp
make\ab\BackgroundImages\Red.bmp
make\ab\ckw\ckw.cfg
make\ab\data\Excel2007.xlsx
make\ab\BackgroundImages
make\ab
make

という風に改行でリストになっているか、

make\ab\BackgroundImages\black - コピー.jpg,make\ab\BackgroundImages\black.jpg,make\ab\BackgroundImages\glay.jpg,make\ab\BackgroundImages\purple.jpg,make\ab\BackgroundImages\Blue.bmp,...

パスとしては認識されないコンマ (,) を区切り文字として一行の文字列

のようなものがほしいのですが。

本当は std::listとかstd::vectorとかに格納されている方が望ましいですが、これは自分でもできるためスルー。

実際に取得出来たデータを見てもどうやって切り取ればいいかがわかりません。

Excelのセルにあたるセットは半角スペースが "|" のような感じで区切られているようですが、

よく見ると自分が圧縮したファイルのパスに 半角スペースが...

もし半角スペースを分岐点としてstrtok関数等で分割した場合、

実際に取得できたデータで言えば、

本来であれば

make\ab\BackgroundImages\black - コピー.jpg

でひとつであるはずが 半角スペースで区切られるために

make\ab\BackgroundImages\black

  •   コピー.jpg

と三つの文字列に。

一番最初の "7-Zip (a) 9.22 beta  Copyright..." とかは

string::findで ヘッダ(?) の終わりを見つけ出して そこを string::replace で その部分を "" に置き換えればOKなので、スルー。

問題は、テーブルにある ファイルパスをどうやって取得するか。です。

一応、私が 7-Zip をダウンロードしたときに同梱されていた "7-zipCMD.txt" ( 第二引数で設定できるコマンド一覧 ) を見てみると、

  l : リスト
   ̄ ̄ ̄ ̄ ̄
      書庫の内容を取得します。
      取得した内容は _szOutput に出力されます。

    例: l archive.zip

      archive.zip の内容を _szOutput に出力されます。

    このコマンドと共に使用できるスイッチ。

      -ai, -an, -ax, -i, -p, -r, -scc, -slt, -t, -x

とありますが、

"このコマンドと..." にあるスイッチをすべて見てみましたが、「詳細データを取得する」, 「パスのみの取得」等のようなスイッチはありませんでした。

(言い回しが違う場合がありますが、それぽいのもない...)

コマンドプロンプトで DIRコマンドを使ったとき、

ただ単に

DIR

と打ったら

日付 + 時間 + ( "<DIR>" or なし ) + ファイルサイズ + ファイル名(またはディレクトリ名)

と出ますよね。

DIR /B

と打ったら

ファイル名(またはディレクトリ名)

だけ出力されますよね。

その "DIR /B" のときのような感じにしたいのです。

そうすれば 改行文字 を分岐点 ( 区切り文字 ) として分割すればいいだけですし。

これをやるにはどうすればいいのでしょうか?

[環境等]
言語      : C/C++ ( Windows API あり )
コンパイラ: MinGW

宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

SevenZipFindFirst 等のAPIを利用するのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/27 12:32

    なるほど、ファイルの列挙がありましたか。

    キャンセル

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • C

    4007questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3791questions

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

  • Win32 API

    247questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。