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
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/27 03:32