Mengzip Kandungan dalam Folder tanpa Folder Root
Keperluan adalah untuk mencipta fail ZIP yang mengandungi fail dalam direktori, tidak termasuk direktori itu sendiri sebagai folder akar semasa pengekstrakan.
Coretan yang disediakan cuba mencapai ini dengan menetapkan nama pengepala menggunakan baris berikut:
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
Walau bagaimanapun, kod ini menambah direktori asas ( cth., "dir1") kepada nama pengepala, menghasilkan arkib yang mana fail bersarang dalam struktur direktori.
Untuk menangani isu ini, baris itu hendaklah digantikan dengan yang berikut:
header.Name = strings.TrimPrefix(path, source)
Ini mengalih keluar direktori asas daripada nama pengepala, memastikan fail diekstrak tanpa struktur direktori.
Kod yang diubah suai akan kelihatan seperti ini:
import ( "archive/zip" "fmt" "io" "os" "path/filepath" ) func Zipit(source, target string) error { zipfile, err := os.Create(target) if err != nil { return err } defer zipfile.Close() archive := zip.NewWriter(zipfile) defer archive.Close() info, err := os.Stat(source) if err != nil { return nil } filepath.Walk(source, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } if info.IsDir() { header.Name += "/" } else { header.Method = zip.Deflate } writer, err := archive.CreateHeader(header) if err != nil { return err } if info.IsDir() { return nil } file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) return err }) return err } func main() { err := Zipit("path/dir1" +"/", "test"+".zip") if err != nil { fmt.Println(err) } }
Kod ini berkesan mengezip kandungan dalam direktori "dir1" tanpa memasukkan direktori itu sendiri dalam fail ZIP.
Atas ialah kandungan terperinci Bagaimana untuk Zip Kandungan Folder Tanpa Folder Root dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!