Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah saya mendapat ralat \"terlalu banyak fail terbuka\" semasa menyahmampat fail tar.gz dalam Go?

Mengapakah saya mendapat ralat \"terlalu banyak fail terbuka\" semasa menyahmampat fail tar.gz dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 22:35:02387semak imbas

Why am I getting a

Cara Nyahmampat Fail tar.gz dalam Go

Dalam soalan ini, pengguna cuba menyahmampat fail yang dipanggil file.tar. gz, yang mengandungi folder, menggunakan Go. Mereka telah menghadapi ralat menyatakan "terlalu banyak fail terbuka" semasa cuba mencipta fail.

Kod yang disediakan pada dasarnya mengekstrak kandungan fail tar.gz, tetapi terdapat isu kecil dalam pengendalian biasa fail (TypeReg). Kesilapannya terletak pada tidak menutup fail output, outFile, selepas menyalin kandungannya. Kegagalan untuk menutup fail dengan anggun mengakibatkan ralat "terlalu banyak fail terbuka" kerana fail kekal terbuka walaupun selepas fungsi kembali.

Untuk membetulkannya, kami boleh mengubah suai fungsi ExtractTarGz untuk menutup fail output selepas menyalin kandungannya. Berikut ialah kod yang dikemas kini:

<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 output file after copying its contents
        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>

Kod yang diubah suai termasuk panggilan ke outFile.Close() untuk menutup fail output secara eksplisit selepas menyalin kandungannya. Ini memastikan bahawa fail ditutup dan dikeluarkan dengan betul, menghalang ralat "terlalu banyak fail terbuka".

Atas ialah kandungan terperinci Mengapakah saya mendapat ralat \"terlalu banyak fail terbuka\" 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