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

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

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

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

Win32 API

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

C++

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

Q&A

解決済

1回答

4684閲覧

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

BeatStar

総合スコア4958

C

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

Win32 API

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

C++

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

0グッド

0クリップ

投稿2017/01/27 03:14

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

宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2017/01/27 03:20

t_obara

総合スコア5488

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

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

BeatStar

2017/01/27 03:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問