루트 폴더 없이 폴더 내 콘텐츠 압축
요구 사항은 디렉터리 내의 파일을 포함하는 ZIP 파일을 생성하는 것입니다. 디렉토리 자체는 추출 시 루트 폴더입니다.
제공된 스니펫은 다음을 사용하여 헤더 이름을 설정하여 이를 달성하려고 시도합니다. line:
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" 디렉터리에 디렉터리 자체를 포함하지 않고 "dir1" 디렉터리 내의 콘텐츠를 효과적으로 압축합니다. ZIP 파일입니다.
위 내용은 Go에서 루트 폴더 없이 폴더 콘텐츠를 압축하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!