Go 言語での tar アーカイブ ファイルの読み取りおよび書き込み操作

Go 言語での tar アーカイブ ファイルの読み取りおよび書き込み操作

 
 
前のセクション「 .zip アーカイブ ファイルの作成」では、zip アーカイブ ファイルの作成と読み込みについて紹介しました。次に、tar アーカイブ ファイルの作成と読み込みについて紹介します。

 

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 などのインターフェイスを使用してファイルを処理する方法により、開発者は同じエンコード モードを使用してファイルや他のストリーム (ネットワーク ストリームなど) を読み書きすることができます。文字列). これにより、難易度が大幅に軽減されます。

 

「 Go 言語での tar アーカイブ ファイルの読み取りおよび書き込み操作」についてわかりやすく解説!絶対に観るべきベスト2動画

【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】
#15 初見のGo言語で掲示板を作ってみる シャチョーのコードチャレンジ!