tar アーカイブを作成する
tar はパッケージ化形式ですが、ファイルは圧縮されないため、圧縮する必要がないため、パッケージ化されたドキュメントは通常、zip や tar.gz よりもはるかに大きくなり、パッケージング速度が非常に速くなり、CPU 使用率も低くなります。梱包時のレートも低く、非常に低いです。
tar の目的は、ファイルの管理を容易にすることです。たとえば、私たちの生活では、部屋の隅々に多くの小さなアイテムが散らばっています。利便性と整頓のために、これらの散らばったアイテムをボックスに整理し、その機能を実現します。タールの場合もこれに似ています。
tar アーカイブの作成は .zip アーカイブの作成と非常に似ていますが、主な違いは、すべてのデータを同じライターに書き込むことと、ファイルのデータの前に単なるファイル名ではなく完全なヘッダーを書き込む必要があることです。
タール包装の原理は次のとおりです。
- ファイル x.tar を作成し、tar ヘッダー情報を x.tar に書き込みます。
- tar 化するファイルを開き、ヘッダー情報を x.tar に書き込み、次にファイル情報を x.tar に書き込みます。
- tar 化するファイルが複数ある場合は、すべてのファイルが x.tar に書き込まれるまで 2 番目の手順を繰り返します。
- x.tar を閉じて、パッケージ化を完了します。
以下は、サンプル プログラムを使用した Go 言語の tar パッケージ化の実装の簡単なデモンストレーションです。
package main
import(
"archive/tar"
"fmt"
"io"
"os"
)
func main()
F, err:= os.Create("./ output.tar")// tarファイルを作成します
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
tw:= tar.NewWriter(f)
defer tw.Close()
fileinfo, err:= os.Stat(“./ main.exe”)//関連するファイル情報を取得します
if err!= nil {
fmt.Println(err)
}
hdr, err:= tar.FileInfoHeader(fileinfo、"")
if err != nil {
fmt.Println(err)
}
err = tw.WriteHeader(hdr)//ヘッダファイル情報を書き込みます
if err != nil {
fmt.Println(err)
}
f1, err:= os.Open(“./ main.exe”)
if err!= nil {
fmt.Println(err)
return
}
m, err:= io.Copy(tw、f1)//main.exeファイルの情報を圧縮パッケージに書き込みます
if err!= nil {
fmt.Println(err)
}
fmt.Println(m)
}
tar アーカイブを抽出します
tar アーカイブを解凍するのは、tar アーカイブを作成するよりも若干簡単です。まずファイルを開き、tar ヘッダーからアーカイブ ファイルに保存されているヘッダー情報をループし、ファイル ヘッダーからファイル名を読み取り、このファイル名でファイルを作成し、このファイルに書き込む必要があります。データを入力するだけです。 。
サンプルコードは次のとおりです。
package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("output.tar")
if err != nil {
fmt.Println("ファイルを開けません", err)
return
}
defer f.Close()
r := tar.NewReader(f)
for hdr, err := r.Next(); err != io.EOF; hdr, err = r.Next() {
if err != nil {
fmt.Println(err)
return
}
fileinfo := hdr.FileInfo()
fmt.Println(fileinfo.Name())
f, err := os.Create("123" + fileinfo.Name())
if err != nil {
fmt.Println(err)
}
defer f.Close()
_, err = io.Copy(f, r)
if err != nil {
fmt.Println(err)
}
}
}
上記のプログラムを実行すると、次の図に示すように、tar パッケージ内のファイルが現在のディレクトリに解凍されます。
これで、ファイルの圧縮とアーカイブ、および一般的なファイル処理についての説明が完了しました。 Go 言語が io.Reader、io.ReadCloser、io.Writer、io.WriteCloser などのインターフェイスを使用してファイルを処理する方法により、開発者は同じエンコード モードを使用してファイルや他のストリーム (ネットワーク ストリームなど) を読み書きすることができます。文字列). これにより、難易度が大幅に軽減されます。