Архивирование содержимого в папке без корневой папки
Требование состоит в том, чтобы создать ZIP-файл, содержащий файлы в каталоге, за исключением сам каталог является корневой папкой при извлечении.
Приведенный фрагмент пытается добиться этого, устанавливая имя заголовка, используя следующее строка:
header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
Однако этот код добавляет базовый каталог (например, «dir1») в имя заголовка, в результате чего создается архив, в котором файлы вложены в структуру каталогов.
Чтобы решить эту проблему, строку следует заменить на следующее:
header.Name = strings.TrimPrefix(path, source)
Это удаляет базовый каталог из имени заголовка, гарантируя, что файлы будут извлечены без структуры каталогов.
Измененный код будет выглядеть так:
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) } }
Этот код эффективно сжимает содержимое каталога «dir1», не включая сам каталог в ZIP-файл.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3