複数のファイルをひとつにまとめ、そこから読み出す方法

[戻る]
2006/01/12(木) 12:13:31
こんにちは
いつもお世話になっております

環境:WinXP、VC++6.0、MFC、SDI

現在作成しているアプリケーションでは、比較的小さいサイズのビットマップを
かなりたくさん使用しています
今まではそれを全てリソースとして扱っていたのですが、
今後も数が増える可能性があり、外部ファイルとして扱いたいと考えました

しかしビットマップファイルをそのまま裸で配布することはできれば避けたいのです
リソースに入れていたのはそのためです

そこで例えばゲームなどで、データファイルを全てまとめて1つの大きな
ファイルにしてあるようなものを見ることがありますよね
そしてそこから読み出すような
あのような形にできれば理想的なのですが・・・

ここで質問です

あのような手法を一般的になんと呼ぶのでしょう?
それがわからずネットや過去ログ検索でもうまく情報を探し当てられませんでした

またそういったものには広く使われている手法はあるのでしょうか
特に分解されて困るわけではないので、もし公開されているライブラリなどあるならば
それを利用したいと考えています

もしもできるならばデータファイルから読み出すときに同時にHBITMAPを
得られるようなものが理想的ではあります
ちなみに今回対象になるファイルはビットマップファイルだけの予定です

何か情報をお持ちの方がいらっしゃいましたら教えていただけるとありがたいです
よろしくお願いします

KING・王 2006/01/12(木) 12:28:43
> あのような手法を一般的になんと呼ぶのでしょう?
とりあえず、複数のファイルを1つのファイルにまとめる手法をアーカイブと呼びます。

> またそういったものには広く使われている手法はあるのでしょうか
cabファイルとか、zipファイルとか、日本でならlhzとか・・・

次のサイトなどが参考になるのでは?
http://www.madobe.net/archiver/index.html

dairygoods 2006/01/12(木) 12:28:45
リソースDLLを作るのはどうでしょう。
http://www.athomejp.com/goldfish/vcused/resource.asp

KING・王 2006/01/12(木) 12:31:36
> cabファイルとか、zipファイルとか、日本でならlhzとか・・・
lhzではなく、lhaです。。。orz

でも
> 特に分解されて困るわけではないので、
ということなので、dairygoods さんの方法の方がおすすめのようなきがします。

ゲームなんかは、分解されると困ったりするので、
独自の手法でアーカイブしてたりするようですが。(おそらく)

PATIO 2006/01/12(木) 13:19:50
実行ファイルの修正をしているわけでもないのに実行ファイルのリビルドをしたくない
と言う話ならdairygoodsさんの方法の方が一般的でしょう。
実際の話リソースのみのDLLを作成して使用しているケースって結構多いです。

2006/01/12(木) 20:23:56
KING・王さん、dairygoodsさん、PATIOさん、レスありがとうございます

> リソースDLLを作るのはどうでしょう。

このような方法があるのですね

目的や扱いやすさを考えるとこの方法がお手軽でいいかもしれません
手元にあるものだけですぐに取り掛かれそうですし

ひとまず今回はこの方法で進めてみようと思います

> 複数のファイルを1つのファイルにまとめる手法をアーカイブと呼びます。

言葉自体は知っていましたが、単に圧縮ファイルのようなイメージを持っていました
実際、紹介していただいたCAB、ZIP、LZHなどの形式は今まで単に圧縮ファイルとしか
認識していませんでした

しかしいろいろ検索をかけてみた結果、例えばZIPファイルを解凍せずに中のデータを
アプリから使用することができるようなことが書かれているところもありました
その方法まではまだたどり着くことができていませんが

それにしても「アーカイブ」という言葉の意味が広いせいか、関係のない情報ばかり
出てきてしまってなかなか目的の情報を探し出すことができませんね・・・

今回はこちらの方法は使わないことになりましたが、なかなか興味深いです
アーカイブの中にフォルダ階層を作ることも可能だというような情報もありましたし
さらに大量で多種多様なデータファイルを扱う場合には必要になってくるのかも
しれませんね

余裕ができたらこちらに関してもさらに詳しく調べてみようと思います

なお、リソースDLLの方ですが、実際にはまだ試せていません
これから実際に作成してみて、後ほどその結果を報告したいと思います

シャノン 2006/01/12(木) 20:58:53
#余談。

>> 複数のファイルを1つのファイルにまとめる手法をアーカイブと呼びます。

> 言葉自体は知っていましたが、単に圧縮ファイルのようなイメージを持っていました
> 実際、紹介していただいたCAB、ZIP、LZHなどの形式は今まで単に圧縮ファイルとしか
> 認識していませんでした

本来、「複数のファイルを1つにまとめること」が「アーカイブ」であって、圧縮はお
まけです。
Unix 系で広く使われる TAR という形式(統合アーカイバライブラリでは Tar32.dll が
対応しています)は、ファイルをまとめるだけで、圧縮はしません。
そのため、TAR でまとめた後、GZip とか BZip2 といった圧縮をかけて、tar.gz とか、
tar.bz2 という形で使われるのが一般的です。
ちなみに、GZip とか BZip2 にはアーカイブ機能はありません(単ファイル圧縮で
す)。

> 例えばZIPファイルを解凍せずに中のデータを
> アプリから使用することができるようなことが書かれているところもありました

解凍していないわけではありません。
解凍した結果をファイルに吐き出さず、メモリ上に持っておいて、それを使っているだ
けです。

2006/01/13(金) 22:42:03
シャノンさん、補足説明どうもありがとうございます
おかげさまでだいぶイメージが明確になってきました

TARの構造についても簡単に調べてみましたが、
特別に複雑なことをしているわけではないようですね
順を追って調べていけばなんとか理解できそうな気がします

それと本題のリソースDLLですが、ひとまずリソースDLLの作成および
リソースDLLからのリソースの読み出しに成功しました
後はアプリケーションに組み込むだけです

それで少し本題とははずれてしまうのですが、ひとつわからないことがあります

作成したリソースDLLをアプリケーションに組み込む際に、そのDLLに組み込まれている
リソースのIDが書かれているヘッダファイル(resource.h)が必要になりますよね

しかしアプリケーション側にもやはり同じ名前のresource.hがあるので、
名前がかぶってしまうことになります

そこでリソースDLLを作成する時に出力されるresource.hの名前を
変更したいのですが、その方法が見つかりません

自分でリソースファイル(.rc)に書かれている
#include "resource.h"
の行を書き換え、ヘッダファイル名もそれに合わせて変更してみたりもしましたが、
一度でもリソースエディタで編集して保存するとresource.hに戻ってしまいました

ここで出力されるresource.hの名前を自分で設定できないものでしょうか
プロジェクトの設定を見てみましたがそれらしき項目が見つかりませんでした

もっとも手動でファイル名を変更してもそれほど手間ではないのですが、
もし何かしら方法があるのならばそれを知りたいです

YuO [E-Mail] 2006/01/14(土) 04:01:44
ResourceViewで「……リソース」となっているアイテムを右クリックすると,
「インクルードファイルの設定」というメニュー項目があります。

そこにある,「シンボル用のヘッダーファイル」を別の名前にすればよいです。

2006/01/14(土) 12:07:58
[[解決]]
YuOさん、ありがとうございます

教えてもらった方法で無事名前を変更できました
しかしこんなところで設定できるとは・・・盲点です

ではこれをもちまして今回の質問は解決といたします
みなさん、どうもありがとうございました

古いスレッドには追加発言できません。