使用 Go 的 archive/zip 创建带有 Unicode 文件名的 zip 存档

package main


import (

    "archive/zip"

    "fmt"

    "io"

    "os"

    "path/filepath"

    "strings"

)


func main() {

    var (

        Path = os.Args[1]

        Name = os.Args[2]

    )


    File, _ := os.Create(Name)

    PS := strings.Split(Path, "\\")

    PathName := strings.Join(PS[:len(PS)-1], "\\")

    os.Chdir(PathName)

    Path = PS[len(PS)-1]

    defer File.Close()

    Zip := zip.NewWriter(File)

    defer Zip.Close()

    walk := func(Path string, info os.FileInfo, err error) error {

        if err != nil {

            fmt.Println(err)

            return err

        }

        if info.IsDir() {

            return nil

        }

        Src, _ := os.Open(Path)

        defer Src.Close()

        fmt.Println(Path)

        FileName, _ := Zip.Create(Path)

        io.Copy(FileName, Src)

        Zip.Flush()

        return nil

    }

    if err := filepath.Walk(Path, walk); err != nil {

        fmt.Println(err)

    }

}

这个 mydir 路径:


-----root

    |---2015-05(dir)

         |---中文.go

    |---package(dir)

    |---你好.go

当我使用这个代码目录时,中文会出现乱码。谁能帮我解决问题。


慕妹3242003
浏览 184回答 2
2回答

不负相思意

package mainimport (    "archive/zip"    "fmt"    "io"    "os"    "path/filepath"    "strings")func main() {    var (        Path = os.Args[1]        Name = os.Args[2]    )    File, _ := os.Create(Name)    PS := strings.Split(Path, "\\")    PathName := strings.Join(PS[:len(PS)-1], "\\")    os.Chdir(PathName)    Path = PS[len(PS)-1]    defer File.Close()    Zip := zip.NewWriter(File)    defer Zip.Close()    walk := func(Path string, info os.FileInfo, err error) error {        if err != nil {            fmt.Println(err)            return err        }        if info.IsDir() {            return nil        }        Src, _ := os.Open(Path)        defer Src.Close()        //FileName, _ := Zip.Create(Path)        h := &zip.FileHeader{Name: Path, Method: zip.Deflate, Flags: 0x800}        FileName, _ := Zip.CreateHeader(h)        io.Copy(FileName, Src)        Zip.Flush()        return nil    }    if err := filepath.Walk(Path, walk); err != nil {        fmt.Println(err)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go