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