Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Ralat Buka Fail Semasa Menyahmampat Fail tar.gz dalam Go?

Bagaimana untuk Mengelakkan Ralat Buka Fail Semasa Menyahmampat Fail tar.gz dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-03 20:29:291023semak imbas

How to Avoid File Open Errors When Decompressing tar.gz Files in Go?

Cara Nyahmampat Fail tar.gz dalam Go

Menyahmampat fail tar.gz adalah penting untuk mengekstrak data dan folder daripada arkib. Dalam Go, proses ini melibatkan penggunaan pakej arkib/tar dan kompres/gzip. Walau bagaimanapun, adalah penting untuk memastikan bahawa kod yang digunakan berjaya mengekstrak fail tanpa menghadapi ralat.

Penyelesaian Yang Diperbaiki:

Kod yang dipertingkatkan yang disediakan menyelesaikan isu apabila fail dibuka ralat berlaku kerana terlalu banyak fail terbuka. Ia berbuat demikian dengan mengalihkan pernyataan defer outFile.Close() ke penghujung setiap pernyataan kes yang membuka fail untuk menulis. Ini memastikan bahawa fail ditutup serta-merta selepas menyalin kandungan, menghalang pengumpulan fail terbuka dan ralat seterusnya.

<code class="go">package main

import (
    "archive/tar"
    "compress/gzip"
    "fmt"
    "io"
    "log"
    "os"
)

func ExtractTarGz(gzipStream io.Reader) {
    uncompressedStream, err := gzip.NewReader(gzipStream)
    if err != nil {
        log.Fatal("ExtractTarGz: NewReader failed")
    }

    tarReader := tar.NewReader(uncompressedStream)

    for true {
        header, err := tarReader.Next()

        if err == io.EOF {
            break
        }

        if err != nil {
            log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
        }

        switch header.Typeflag {
        case tar.TypeDir:
            if err := os.Mkdir(header.Name, 0755); err != nil {
                log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
            }
        case tar.TypeReg:
            outFile, err := os.Create(header.Name)
            if err != nil {
                log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
            }
            if _, err := io.Copy(outFile, tarReader); err != nil {
                log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
            }
            outFile.Close() // Close the file immediately after copying

        default:
            log.Fatalf(
                "ExtractTarGz: uknown type: %s in %s",
                header.Typeflag,
                header.Name)
        }
    }
}
func main() {
    r, err := os.Open("./file.tar.gz")
    if err != nil {
        fmt.Println("error")
    }
    ExtractTarGz(r)
}</code>

Kesimpulan:

Kod dikemas kini ini menyahmampat fail tar.gz dengan betul dan memastikan semua fail yang terbuka ditutup dengan betul, mengelakkan ralat yang disebabkan oleh fail terbuka yang berlebihan. Dengan peningkatan ini, pembangun Go boleh mengekstrak data dan folder dengan mudah daripada arkib tar.gz.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat Buka Fail Semasa Menyahmampat Fail tar.gz dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn