7

基本的に、指定されたファイル名のリストのアーカイブ ファイルを作成するプログラムを C で作成しています。arこれは、Linuxのコマンドにかなり似ています。アーカイブ ファイルは次のようになります。

!<arch>
file1.txt/      1350248044  45503 13036 100660  28        `
hello
this is sample file 1
file2.txt/      1350512270  45503 13036 100660  72        `
hello
this is sample file 2
this file is a little larger than file1.txt

しかし、アーカイブからファイルを抽出するのに苦労しています。ユーザーが抽出したいとしましょうfile1.txt。ファイル名(この場合は file1.txt)のインデックス/場所を取得し、 58 文字をスキップしてファイルのコンテンツに到達し、コンテンツを読み取り、新しいファイルに書き込む必要があります。だからここに私の質問があります:

1) アーカイブ ファイル内のファイル名のインデックス/場所を取得するにはどうすればよいですか? 重複するファイル名は許可されていないことに注意してください。したがって、2 つの異なるインデックスを持つことを心配する必要はありません。

2) ファイルを読み取るときに、どうすれば複数の文字 (この場合は 58) をスキップできますか?

3) ファイルの内容がいつ終了するかを知るにはどうすればよいですか? file2.txt/つまり、コンテンツを読み取ってヘッダーの直前で停止する必要があります。

4

2 に答える 2

3

この問題を解決するための私のアプローチは次のとおりです。

各ファイルのサイズ、名前、およびファイル内の場所を含むヘッダー情報を取得します。

次に、ヘッダーを解析し、または関数を使用fseek() and ftell()してファイルのバイトを取得し、そのデータを作成して書き込みます。これは私が考えることができる最も簡単な方法です。fgetc()fread()

http://en.wikipedia.org/wiki/Ar_(Unix)#File_header <- ar アーカイブのヘッダー。

例: @programmer93 ヘッダーの長さが 80 バイトであると考えてください (ヘッダーにはアーカイブ ファイルのメタデータが含まれます)。112 バイトと 182 バイトの 2 つのファイルがあります。現在、それらはフラット ファイル (アーカイブ ファイル) に配置されています。したがって、 80(header).112(file1.txt).182(file2.txt).EOF になります。したがって、各ファイルのサイズがわかっている場合は、(fseek() を使用して) 特定のファイルに簡単にナビゲートし、そのファイルのみを抽出することができます。[file2.txt を抽出するにはfseek(FILE*,(112+80),SEEK_SET);、fgetc() を 182 回実行します。私は自分自身を明確にしたと思いますか?

于 2012-10-18T21:53:41.600 に答える
1

追加のヘッダー情報を追加してもファイルの形式を変更できない場合は、ファイルを検索して、作業を進めていく必要があります。

これは難しすぎてはいけません。ファイルを読むだけで、次のようなヘッダー行を読むと

file1.txt/      1350248044  45503 13036 100660  28        `

ファイル名やサイズなどを確認できます( の後にヘッダー行があることはご存知でしょう!<arch>)。これが目的のファイルである場合ftell() 、stdio.h の関数がファイル内の正確な場所を教えてくれます。ファイル サイズはヘッダー行にバイト単位で示されているため、通常の方法でその特定のバイト数を先読みすることでファイルを読み取ることができます。同様に、目的のファイルでない場合は、 を使用fseek()して、スキップするファイル内のバイト数を進め、次のファイルのヘッダー情報を読み取ってプロセスを繰り返す準備をすることができます。

于 2012-10-19T00:52:05.413 に答える