golang 咋这么恶心,解压 zip 文件居然要一大串代码,这不应该是语言内置一行搞定的吗?

2022-12-03 16:43:28 +08:00
 bthulu

这简直不能忍啊

C#版

ZipFile.ExtractToDirectory("source", "target");

Golang 版

func Unzip(src, dest string) error {
    r, err := zip.OpenReader(src)
    if err != nil {
        return err
    }
    defer func() {
        if err := r.Close(); err != nil {
            panic(err)
        }
    }()

    os.MkdirAll(dest, 0755)

    // Closure to address file descriptors issue with all the deferred .Close() methods
    extractAndWriteFile := func(f *zip.File) error {
        rc, err := f.Open()
        if err != nil {
            return err
        }
        defer func() {
            if err := rc.Close(); err != nil {
                panic(err)
            }
        }()

        path := filepath.Join(dest, f.Name)

        // Check for ZipSlip (Directory traversal)
        if !strings.HasPrefix(path, filepath.Clean(dest) + string(os.PathSeparator)) {
            return fmt.Errorf("illegal file path: %s", path)
        }

        if f.FileInfo().IsDir() {
            os.MkdirAll(path, f.Mode())
        } else {
            os.MkdirAll(filepath.Dir(path), f.Mode())
            f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
            if err != nil {
                return err
            }
            defer func() {
                if err := f.Close(); err != nil {
                    panic(err)
                }
            }()

            _, err = io.Copy(f, rc)
            if err != nil {
                return err
            }
        }
        return nil
    }

    for _, f := range r.File {
        err := extractAndWriteFile(f)
        if err != nil {
            return err
        }
    }

    return nil
}
10196 次点击
所在节点    Go 编程语言
50 条回复
Fuhuang
2022-12-04 14:09:16 +08:00
不,是你原来习惯的.Net 太实用了
adoyle
2022-12-04 14:43:48 +08:00
已 block (善意提醒以后别回我的评论,我看不到的)
lincanbin
2022-12-04 15:58:22 +08:00
slice contain 、max 、min 也没有。
习惯就好。
bthulu
2022-12-05 08:25:51 +08:00
@liubaicai 仔细看过了, 并不需要导入任何 nuget 包
bthulu
2022-12-05 08:29:10 +08:00
@adoyle block 谁还不会啊, 已 block (善意提醒以后别回我的评论,我也看不到的)
dragonsunmoon
2022-12-05 16:48:27 +08:00
只能说明 go 的生态还不行, 自带的标准库比不上 .net 和 java. 开源的工具库项目里, 很少有类似有基金会支持的开源项目, 代码质量和后续维护都令人担忧, 大家都不得不自己造轮子
dragonsunmoon
2022-12-05 17:33:25 +08:00
有一说一, go 的标准库是真的简陋, 不好用. 就连个 decimal 标准库里都没有. 感觉设计实现标准库的人, 完全没有做过业务系统, api 的易用性完全是一点都不考虑, 唉...
blsm
2022-12-07 14:20:09 +08:00
go 的生态确实不太行,标准库太简陋了。不内置,官方出个工具包也行
chinaufo
2022-12-19 18:17:16 +08:00
golang 内置不行就是不行,为什么不敢承认呢
allgy
2022-12-26 15:07:14 +08:00
厨子不行怪灶台

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899827

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX