"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go에서 루트 폴더 없이 폴더 콘텐츠를 압축하는 방법은 무엇입니까?

Go에서 루트 폴더 없이 폴더 콘텐츠를 압축하는 방법은 무엇입니까?

2024년 11월 18일에 게시됨
검색:690

How to Zip Folder Content Without the Root Folder in Go?

루트 폴더 없이 폴더 내 콘텐츠 압축

요구 사항은 다음을 제외한 디렉터리 내 파일이 포함된 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)
    }
}

이 코드는 ZIP 파일에 디렉터리 자체를 포함하지 않고 "dir1" 디렉터리 내의 콘텐츠를 효과적으로 압축합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3