这简直不能忍啊
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
}
1
XieGP 2022 年 12 月 3 日 py 写多了吗:)
|
2
loolac 2022 年 12 月 3 日
当然,还需要一台电脑 ~
|
3
ChrisFreeMan 2022 年 12 月 3 日 真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放
|
4
GeruzoniAnsasu 2022 年 12 月 3 日
C: ……
|
5
yazinnnn 2022 年 12 月 3 日 ?迷惑发言
|
6
wwqgtxx 2022 年 12 月 3 日 今日迷惑行为大赏
|
7
icepie 2022 年 12 月 3 日 Golang 版
Unzip("source", "target") |
8
yazinnnn 2022 年 12 月 3 日 楼主发的这些帖子看上去跟个流量号似的
|
9
ClarkAbe 2022 年 12 月 3 日 via Android
zz 发言......自个封装一个就能实现, 你要是懒得封装只能说你不要用这种接近底层的语言了....去 py 吧
|
10
HugoChao 2022 年 12 月 3 日
你代码都有了为什么不封装一下呢
|
11
oldshensheep 2022 年 12 月 3 日 因为
if err != nil { return err } |
12
C0VN 2022 年 12 月 3 日
你写一个包给大家用不就好了。
|
13
Jooooooooo 2022 年 12 月 3 日
golang 的 Unzip 不也是一行?
|
14
QI41mOpKTG3jLhDt 2022 年 12 月 3 日
把这里面封一层再调用不就行了吗
|
15
liuidetmks 2022 年 12 月 3 日 via iPhone
c 不是更麻烦?
|
16
deorth 2022 年 12 月 3 日 via Android
要在脑子里打开
|
17
swulling 2022 年 12 月 3 日 via iPhone |
18
shakukansp 2022 年 12 月 3 日
???
|
19
yanqiyu 2022 年 12 月 3 日 Go 语言并没有将解压 zip 文件作为语言内置的功能,这是因为 Go 的设计理念是尽可能保持简单,而不是提供尽可能多的功能。因此,如果你需要在 Go 中解压 zip 文件,就需要使用第三方库来实现这个功能。这些库通常都提供了一些简单的函数,可以让你在 Go 代码中很容易地解压 zip 文件。比如,你可以使用 Go 语言内置的 "archive/zip" 包来解压 zip 文件,它提供了一个名为" Unzip "的函数,可以让你很容易地解压 zip 文件。
不是我说的,是 ChatAI 说的🐶 https://twitter.com/clowwindy/status/1598979812831657984/photo/1 |
20
infinityv 2022 年 12 月 3 日 via iPhone @yanqiyu #19 chatgpt 今天给我说 go 是一门动态语言,我说你特么扯淡呢吧,然后他就向我道歉,说我是对的。
|
22
dw2693734d 2022 年 12 月 3 日
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 |
23
MMMMMMMMMMMMMMMM 2022 年 12 月 3 日 不想造轮子就找 lib 呗,多简单一事
小编这边推荐你使用易语言哦,不仅也只需要一行,还是中文的哦~ |
24
ghostwind 2022 年 12 月 3 日
go 真正麻烦的解压缩 rar 文件
|
25
LykorisR 2022 年 12 月 3 日
??
|
26
liaohongxing 2022 年 12 月 3 日
rar 是专利格式 ,go 官方类库解压 rar 估计不会有 。
|
27
liubaicai 2022 年 12 月 3 日
ZipFile 也不是 c#自带的吧
|
28
leavic 2022 年 12 月 3 日 你们回什么贴啊,block 走人就是了。
|
29
mmdsun 2022 年 12 月 3 日 |
30
seakingii 2022 年 12 月 3 日
|
31
seakingii 2022 年 12 月 3 日
需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限
|
32
djoiwhud 2022 年 12 月 4 日 via Android
go 语言怎么这么恶心。自动把账号功能收到的资金转账到楼主的账号,这么基础的功能都不能自动实现吗?
本来楼主就要实现万亿资产的目标,都怪 go 太垃圾。 |
33
ewBuyVmLZMZE 2022 年 12 月 4 日
你贴的代码有一定的安全性问题,可以参考我这个实现。
https://github.com/bookstairs/bookhunter/blob/master/internal/file/decompress.go |
35
LANB0 2022 年 12 月 4 日
C:你在说什么? golang 这点代码都还不够我 zip 格式头逐字段解析呢?
|
36
vanton 2022 年 12 月 4 日
有那么多库可以用,你这样自己找麻烦么
|
38
blankmiss 2022 年 12 月 4 日
java 不是一样的 正是因为这样才有很多轮子作者
|
39
JohnBull 2022 年 12 月 4 日
shell 省事,可你嫌不 cool 啊
|
40
oldshensheep 2022 年 12 月 4 日
@blankmiss Java 可不一样
https://gist.github.com/oldshensheep/bea5bd4c313f27884bc87dced9917bf6 带完整的错误处理和流关闭处理,核心函数一共 19 行。 |
41
Fuhuang 2022 年 12 月 4 日
不,是你原来习惯的.Net 太实用了
|
42
adoyle 2022 年 12 月 4 日 已 block (善意提醒以后别回我的评论,我看不到的)
|
43
lincanbin 2022 年 12 月 4 日
slice contain 、max 、min 也没有。
习惯就好。 |
46
dragonsunmoon 2022 年 12 月 5 日
只能说明 go 的生态还不行, 自带的标准库比不上 .net 和 java. 开源的工具库项目里, 很少有类似有基金会支持的开源项目, 代码质量和后续维护都令人担忧, 大家都不得不自己造轮子
|
47
dragonsunmoon 2022 年 12 月 5 日
有一说一, go 的标准库是真的简陋, 不好用. 就连个 decimal 标准库里都没有. 感觉设计实现标准库的人, 完全没有做过业务系统, api 的易用性完全是一点都不考虑, 唉...
|
48
blsm 2022 年 12 月 7 日
go 的生态确实不太行,标准库太简陋了。不内置,官方出个工具包也行
|
49
chinaufo 2022 年 12 月 19 日
golang 内置不行就是不行,为什么不敢承认呢
|
50
allgy 2022 年 12 月 26 日
厨子不行怪灶台
|