• 締切済み

C、C++でアーカイバ(ツール)作成

現在「Winマシンで動くアーカイブツール」の作成をしようと思っているのですが、まずどういうことから勉強したらいいのか路頭に迷っています。 具体的には、 ・Windows上で複数のファイルを1つのファイルとしてまとめることができるツール(元に戻すこともできる) ・GUIベースで動く ・圧縮機能は(現在は)いらない という内容です。 とりあえずツールを作る練習とういう形で、複雑なものではなくボタンを押すだけでファイルが1つになる、といったような単純なものを目指しています。 プログラムは初心者でC、C++の初歩的な部分は一通り押さえているつもりですが、具体的にツールとして物を作るのはこれが初めてなのでどういったところから勉強していくと良いでしょうか。 ネットで調べたところでは、GUIベースでのツール作成ということでとりあえずWindowsプログラミングやMFCなどを現在は勉強しているのですが、肝心の「複数のファイルを1つのファイルにする」という点で困っています。 「アーカイバ」辺りをキーワードに探しているのですが圧縮関係の複雑な情報ばかりなもので・・・^^ 開発環境はVC++2005です。 色々と足りない部分もあるかもしれませんが、ご助言いただけたら幸いです。参考になりそうな本やサイトなどもありましたら、是非紹介いていただけたらと思っています。 どうぞよろしくお願い致します。

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

1つにするというよりは、1つにした後どうやって戻すかを考えれば 1つにするときどんな情報が必要なのかがわかると思います。 ・いくつのファイルが格納されているのか。 ・個々のファイルのサイズはいくつなのか。 ・個々のファイル名は何なのか。(どこに格納されているのか) ・そのファイルは1つになったときそのファイルはどの位置にくるのか。 このくらいあれば、最低限は出来そう。 図付きでわかり易い「すきやき」さんところでも貼っておきます。 http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?%A5%D5%A5%A1%A5%A4%A5%EB%A5%D1%A5%C3%A5%AD%A5%F3%A5%B0

huwaxl623
質問者

お礼

どうもありがとうございます! 紹介いただいたリンク先も拝見させていただきました。 図解とサンプルもあってとても勉強になります。 本当にありがとうございます。

すると、全ての回答が全文表示されます。
  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.3

簡単な原理は systemのファイル管理を参考にしてみよう。 http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%AE%A1%E7%90%86%20%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA 学校での学級での生徒名簿を学年に纏める場合も学級の名簿を1単位にして同じ考えで纏めるのとあまり変らない。 C言語でも文字列は終端記号が設定されているけれどそれはテキストである場合でバイナリファイルを読む場合は別途長さを記録してるよね? 同じ考えが用いられる。 つまり、アーカイブしたファイルがどのくらいの大きさを持っていてどこに入っているかというのを記録しておけば取り出しができると思う。 格納する場合はテキストの追加更新と同じ考えを行えば良い。 できそう?

huwaxl623
質問者

お礼

ご助言ありがとうございます。 つまるところデータそのものに加えてデータのサイズの情報も同時に記録してある形式のファイルを作ればよいという考え方という解釈でよろしいでしょうか。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >とりあえずツールを作る練習とういう形で、複雑なものではなくボタンを >押すだけでファイルが1つになる、といったような単純なものを目指しています。  ↑  それなら最初はコマンド・プロンプト上で動くものを作ってみてはどうでしょうか。 >「複数のファイルを1つのファイルにする」という点で困っています。  ↑  単純に複数のファイルを合併して1つのファイルにすれば良いです。  ただし1つ1つのファイルのサイズ、作成日時、更新日時、アクセス日時、属性などの情報を  合併したファイルのヘッダ部に記録します。 ・圧縮機能は必要ないという事なので純粋な『アーカイバ』ですね。  基本的に複数のファイルを合併して1つのバイナリファイルを作成します。  ヘッダ部もどのように管理するかは自由ですがぱっと考えて2通りあります。  (1)合併ファイルの先頭に全ファイルのインデックス情報を記録する方式  (2)合併ファイルの先頭にアーカイバ識別文字列とファイル数を記録して   1つ目のファイル情報、ファイル内容   2つ目のファイル情報、ファイル内容   3つ目のファイル情報、ファイル内容    :   最後のファイル情報、ファイル内容   という感じで記録する方式 ・(1)はちょうどディスク管理の FAT と同じような感じで管理する方法です。  (2)は lzh、zip と同じような管理方法です。  お勧めは(2)です。  理由は可変長でデータを管理できるので追加、削除が簡単です。  下に(2)の方式のファイル構造のイメージを載せます。 イメージ: +------------------+ |アーカイバ識別文字列| ←自分で決める(ビットマップでは『BM』にあたる文字列) +------------------+ |その他のヘッダ情報| ←アーカイバを管理する上で必要な情報(個数、パスワードなど) +----------+----------+ |ファイル情報|ファイル内容| +----------+----------+ |ファイル情報|ファイル内容| +----------+----------+ |ファイル情報|ファイル内容| +----------+----------+      : +----------+----------+ |ファイル情報|ファイル内容| +----------+----------+ 解説: ・上記のファイル情報には  (1)ファイルのサイズ  (2)ファイルの作成日時  (3)ファイルの更新日時  (4)ファイルのアクセス日時  (5)ファイルの属性  (6)ファイルのCRC32  (7)ファイルのパス情報  (8)その他(付加情報)  などを1つの構造体データとして管理すれば良いです。 ・アーカイバの作成は  (1)指定のファイル検索  (2)1つのファイル情報の取得  (3)1つのファイル内容のCRC32計算  (4)fopen、fclose でファイル情報、ファイル内容を1つの合併ファイルに書き込む ・アーカイバの復元は  (1)合併ファイルのヘッダ情報、ファイル情報を辿り復元したいファイルを探す  (2)復元したいファイルの先頭位置を fseek で移動、ファイルサイズ分を取り出す  (3)復元したファイルのファイル情報を再設定する(日時、属性など) ・以上。参考にして下さい。

huwaxl623
質問者

お礼

ありがとうございます。 (1)のやり方(2)のやり方共に、独自のファイル形式で1つのファイルにまとめるという方法があるんですね。 ファイルの操作のプログラムは勉強不足な部分でもあるので、イメージと解説もご親切に書いて頂き非常に参考になります。 丁度良い勉強になりそうです。 本当にありがとうございます!頑張ってみます。

すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>肝心の「複数のファイルを1つのファイルにする」という点で困っています。 他の似たようなソフトを参考にするんだ。例えば tar とか。 それか アーカイバプロジェクトから dll をひろってきて、アプリケーション側ではそれを利用するだけ。とか。

参考URL:
http://www.csdinc.co.jp/archiver/
huwaxl623
質問者

お礼

ありがとうございます。 色々と調べましたところtarやzipの非圧縮などがそれにあたるようですね。 なるほど、既存のdllを使用するという手はとても懸命な気がしますが今回は練習というか勉強のために自分で一から作ってみるように心がけてみようかとも思っています。 参考URLもありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A