2010-12-01 13 views
5

ビルドしたアプリケーションで出荷する必要がある小さなファイルがたくさんあります。このファイルをアーカイブに入れて、簡単にコピーして再配布できるようにします。 私は実際にそれらをすべて1か所に持つというアイデアが気に入っていますので、何か問題が生じた場合に備えて1つのファイルのmd5を比較する必要があります。簡単なアクセスのためのC++ファイルコンテナ(例:zip)

私は、アーカイブを読み込み、アーカイブ内のファイルのリストを返し、ファイルにアクセスする必要がある場合はファイルをメモリにロードできるクラスについて考えています。

私はすでにzlibとlzma sdkについて知りたいことを達成するためのさまざまな方法についてインターネットを検索しました。 私は本当に移植可能なzlibがどのようなものか分かりませんでしたので、私は本当に魅力的ではありませんでした。私はlzma sdkがあまり好きではなかったので、アプリケーションの爆発を望んでいませんでした問題。 zlibのもう一つの欠点は、私がC/C++の経験を持っていないということです。

また、これは時間が重大な問題であると付け加えなければなりません。私は、アプリケーション内のファイルに簡単にアクセスできる方法で、tarのようなシンプルな形式を実装するのにしばらく時間がかかりましたが、まだそれを行う時間を見つけられませんでした。

私が探しているのは、アーカイブ内のファイルにアクセスできるライブラリです。誰かが私をここの正しい方向に向けることができれば嬉しいです。

ありがとうございます。 Robin。

編集:linuxとwindowsでアクセスするにはアーカイブが必要です。申し訳ありませんが、最初は言及しませんでした。

答えて

2

答えは、アーカイブの作成後にコードを使ってアーカイブを変更するかどうかによって異なります。

修正する必要がない場合は、TARを使用できます。これは便利でシンプルな形式です。圧縮が必要な場合は、tar.gzリーダーを実装するか、これを行うライブラリを見つけることができます(オープンソースのものもあります)。

アプリケーションにデータへのランダムアクセスが必要な場合、またはアーカイブを変更する必要がある場合は、通常のTARまたはZIPアーカイブは適切ではありません。 SolFSやCodeBaseファイルシステムなどの仮想ファイルシステムは、仮想ファイルシステムがストレージの頻繁な変更に適しており、アーカイブは主に追記型の読み取りの多い使用シナリオを対象としています。

+2

郵便番号では十分でしょうが、私はVFSという用語を全く見ていませんでした。私はPhysicsFSを見つけました。私はこれがまさに私のプロジェクトに使っているものだと思います。あなたの返事にとても感謝します。 – Robin

2

zlibは、移植性が高く、非常に広く使用されています。 C++インターフェイスを理解できない場合、他の多くの言語の代替手段があります - 「関連外部リンク」hereを参照してください。

別のものを検索してから、別のものを検索してください。

+1

しかし、zlibはOPがアーカイブしたいものをやりません。圧縮は行いますが、.zipファイルの形式はそれ自体では理解できません。 –

+0

はい、圧縮はほんの少しだけ必要ですが、私は主に何百もの小さなファイルを1つのファイルにグループ化する必要があります。 – Robin

2

QtまたはWindowsを使用している場合は、実行可能ファイルのリソース領域にデータをパックすることもできます。この方法を使用して実行可能ファイルを配布するだけで済みます。そのデータにアクセスするためにすでに作成され、テストされている、明確に定義されたAPIがあります。

3

ジップについては、私はいつも部分的にZipUtilsになっています。これはプロセスを簡単にし、zlibとinfo-zipライブラリの上に構築されています。

+0

リンクメイトに感謝しますが、私はそれをWindowsとLinux上で実行する必要があります。 ZipUtilsはWindows上でのみ動作します。 – Robin

+0

@ロビン:あなたはそれをあなたの質問に入れてもいいですか? :)ありがとう! –

0

zlib APIを使用することができます。シンプルでポータブル。アーカイブファイルにアクセスするAPIについては、unzip.hヘッダーを参照してください。それはCで非常に簡単です。

ファイルが小さい場合、それらを文字列リテラルにダンプして(bin2hユーティリティを検索して)、プロジェクトに組み込むことができます。次に、ファイルを読み取るコードを変更します。 ifstreamクラスを使用してすべてのファイルが現在読み込まれている場合は、istringstreamクラスに変更してコードを再コンパイルします。

0

Quazipを試してみてください。これは使いやすいです。圧縮されたファイルをその場で読むストリームとして使うことができます。

+0

提案をいただきありがとうございますが、Qtの依存関係を持つコンソールアプリケーションを膨らませたくありません。 – Robin

関連する問題