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
}
9660 次点击
所在节点    Go 编程语言
50 条回复
XieGP
2022-12-03 16:46:48 +08:00
py 写多了吗:)
loolac
2022-12-03 16:50:40 +08:00
当然,还需要一台电脑 ~
ChrisFreeMan
2022-12-03 16:51:22 +08:00
真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放
GeruzoniAnsasu
2022-12-03 17:03:25 +08:00
C: ……
yazinnnn
2022-12-03 17:04:12 +08:00
?迷惑发言
wwqgtxx
2022-12-03 17:05:55 +08:00
今日迷惑行为大赏
icepie
2022-12-03 17:06:53 +08:00
Golang 版
Unzip("source", "target")
yazinnnn
2022-12-03 17:13:17 +08:00
楼主发的这些帖子看上去跟个流量号似的
ClarkAbe
2022-12-03 17:23:52 +08:00
zz 发言......自个封装一个就能实现, 你要是懒得封装只能说你不要用这种接近底层的语言了....去 py 吧
HugoChao
2022-12-03 17:38:46 +08:00
你代码都有了为什么不封装一下呢
oldshensheep
2022-12-03 17:43:30 +08:00
因为
if err != nil {
return err
}
xavierskip
2022-12-03 17:59:34 +08:00
你写一个包给大家用不就好了。
Jooooooooo
2022-12-03 18:15:01 +08:00
golang 的 Unzip 不也是一行?
QI41mOpKTG3jLhDt
2022-12-03 18:20:13 +08:00
把这里面封一层再调用不就行了吗
liuidetmks
2022-12-03 18:23:03 +08:00
c 不是更麻烦?
deorth
2022-12-03 18:27:51 +08:00
要在脑子里打开
swulling
2022-12-03 18:30:19 +08:00
https://github.com/artdarek/go-unzip

随便找个库就行,go 标准库有些比较底层
shakukansp
2022-12-03 18:36:10 +08:00
???
yanqiyu
2022-12-03 18:57:09 +08:00
Go 语言并没有将解压 zip 文件作为语言内置的功能,这是因为 Go 的设计理念是尽可能保持简单,而不是提供尽可能多的功能。因此,如果你需要在 Go 中解压 zip 文件,就需要使用第三方库来实现这个功能。这些库通常都提供了一些简单的函数,可以让你在 Go 代码中很容易地解压 zip 文件。比如,你可以使用 Go 语言内置的 "archive/zip" 包来解压 zip 文件,它提供了一个名为" Unzip "的函数,可以让你很容易地解压 zip 文件。

不是我说的,是 ChatAI 说的🐶
https://twitter.com/clowwindy/status/1598979812831657984/photo/1
infinityv
2022-12-03 19:08:31 +08:00
@yanqiyu #19 chatgpt 今天给我说 go 是一门动态语言,我说你特么扯淡呢吧,然后他就向我道歉,说我是对的。

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

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

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

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

© 2021 V2EX