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
}
9663 次点击
所在节点    Go 编程语言
50 条回复
seakingii
2022-12-03 19:17:42 +08:00
c#的这个函数方法也是语言内置的,是.NET 类库里的. 语言和库都搞不清楚....
dw2693734d
2022-12-03 19:49:49 +08:00
Golang 确实没有内置的函数来直接解压 zip 文件,但是它提供了一个标准库 "archive/zip",可以用来方便地解压 zip 文件。

解压 zip 文件的一般步骤如下:

导入 "archive/zip" 包
读取 zip 文件内容,比如使用 ioutil.ReadFile()
创建一个 zip.Reader ,用来处理 zip 文件内容
遍历 zip.Reader.File ,获取每一个文件,并解压它
代码示例如下:

```
import (
"archive/zip"
"io"
"io/ioutil"
"os"
"path/filepath"
)

// 解压 zip 文件
func unzip(src, dest string) error {
r, err := zip.OpenReader(src)
if err != nil {
return err
}
defer r.Close()

for _, f := range r.File {
rc, err := f.Open()
if err != nil {
return err
}
defer rc.Close()

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

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

return nil
}
```

from OpenAI
MMMMMMMMMMMMMMMM
2022-12-03 19:52:11 +08:00
不想造轮子就找 lib 呗,多简单一事

小编这边推荐你使用易语言哦,不仅也只需要一行,还是中文的哦~
ghostwind
2022-12-03 19:56:15 +08:00
go 真正麻烦的解压缩 rar 文件
LykorisR
2022-12-03 19:58:57 +08:00
??
liaohongxing
2022-12-03 21:27:20 +08:00
rar 是专利格式 ,go 官方类库解压 rar 估计不会有 。
liubaicai
2022-12-03 21:43:03 +08:00
ZipFile 也不是 c#自带的吧
leavic
2022-12-03 21:50:14 +08:00
你们回什么贴啊,block 走人就是了。
mmdsun
2022-12-03 23:16:09 +08:00
seakingii
2022-12-03 23:42:22 +08:00
@mmdsun 这只是官方实现的库,不是"C#语言自带的功能"...
微软官方实现的库确实用起来方便,比如 File.WriteAllText , 一次性写入文本到一个文件,也很方便,但和"C#语言自带"这个概念不相符,其实用 VB.NET 一样可以用这些函数,只要.NET 支持的语言都可以.
seakingii
2022-12-03 23:44:45 +08:00
需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限
djoiwhud
2022-12-04 02:06:12 +08:00
go 语言怎么这么恶心。自动把账号功能收到的资金转账到楼主的账号,这么基础的功能都不能自动实现吗?

本来楼主就要实现万亿资产的目标,都怪 go 太垃圾。
ewBuyVmLZMZE
2022-12-04 05:30:34 +08:00
你贴的代码有一定的安全性问题,可以参考我这个实现。

https://github.com/bookstairs/bookhunter/blob/master/internal/file/decompress.go
changyang
2022-12-04 09:04:38 +08:00
@yanqiyu 恩必
LANB0
2022-12-04 10:57:11 +08:00
C:你在说什么? golang 这点代码都还不够我 zip 格式头逐字段解析呢?
vanton
2022-12-04 12:29:09 +08:00
有那么多库可以用,你这样自己找麻烦么
liubaicai
2022-12-04 12:37:17 +08:00
@mmdsun “这些示例需要将以下 NuGet 包添加到项目中:” 你仔细看看
blankmiss
2022-12-04 12:45:55 +08:00
java 不是一样的 正是因为这样才有很多轮子作者
JohnBull
2022-12-04 13:20:24 +08:00
shell 省事,可你嫌不 cool 啊
oldshensheep
2022-12-04 13:41:06 +08:00
@blankmiss Java 可不一样
https://gist.github.com/oldshensheep/bea5bd4c313f27884bc87dced9917bf6
带完整的错误处理和流关闭处理,核心函数一共 19 行。

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

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

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

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

© 2021 V2EX