Golang Go语言中为啥解压zip文件要这么多代码
这简直不能忍啊
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
}
Golang Go语言中为啥解压zip文件要这么多代码
更多关于Golang Go语言中为啥解压zip文件要这么多代码的实战教程也可以访问 https://www.itying.com/category-94-b0.html
当然,还需要一台电脑 ~
真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放
C: ……
?迷惑发言
今日迷惑行为大赏
Golang 版
Unzip(“source”, “target”)
楼主发的这些帖子看上去跟个流量号似的
你代码都有了为什么不封装一下呢
因为
if err != nil {
return err
}
你写一个包给大家用不就好了。
golang 的 Unzip 不也是一行?
把这里面封一层再调用不就行了吗
c 不是更麻烦?
要在脑子里打开
https://github.com/artdarek/go-unzip
随便找个库就行,go 标准库有些比较底层
???
Go 语言并没有将解压 zip 文件作为语言内置的功能,这是因为 Go 的设计理念是尽可能保持简单,而不是提供尽可能多的功能。因此,如果你需要在 Go 中解压 zip 文件,就需要使用第三方库来实现这个功能。这些库通常都提供了一些简单的函数,可以让你在 Go 代码中很容易地解压 zip 文件。比如,你可以使用 Go 语言内置的 “archive/zip” 包来解压 zip 文件,它提供了一个名为" Unzip "的函数,可以让你很容易地解压 zip 文件。
不是我说的,是 ChatAI 说的🐶
https://twitter.com/clowwindy/status/1598979812831657984/photo/1
#19 chatgpt 今天给我说 go 是一门动态语言,我说你特么扯淡呢吧,然后他就向我道歉,说我是对的。
c#的这个函数方法也是语言内置的,是.NET 类库里的. 语言和库都搞不清楚…
Golang 确实没有内置的函数来直接解压 zip 文件,但是它提供了一个标准库 “archive/zip”,可以用来方便地解压 zip 文件。
解压 zip 文件的一般步骤如下:
导入 “archive/zip” 包
读取 zip 文件内容,比如使用 ioutil.ReadFile()
创建一个 zip.Reader ,用来处理 zip 文件内容
遍历 zip.Reader.File ,获取每一个文件,并解压它
代码示例如下:<br>import (<br> "archive/zip"<br> "io"<br> "io/ioutil"<br> "os"<br> "path/filepath"<br>)<br><br>// 解压 zip 文件<br>func unzip(src, dest string) error {<br> r, err := zip.OpenReader(src)<br> if err != nil {<br> return err<br> }<br> defer r.Close()<br><br> for _, f := range r.File {<br> rc, err := f.Open()<br> if err != nil {<br> return err<br> }<br> defer rc.Close()<br><br> path := filepath.Join(dest, <a target="_blank" href="http://f.Name" rel="nofollow noopener">f.Name</a>)<br> if f.FileInfo().IsDir() {<br> os.MkdirAll(path, f.Mode())<br> } else {<br> f, err := os.OpenFile(<br> path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())<br> if err != nil {<br> return err<br> }<br> defer f.Close()<br><br> _, err = io.Copy(f, rc)<br> if err != nil {<br> return err<br> }<br> }<br> }<br><br> return nil<br>}<br>
from OpenAI
不想造轮子就找 lib 呗,多简单一事
小编这边推荐你使用易语言哦,不仅也只需要一行,还是中文的哦~
go 真正麻烦的解压缩 rar 文件
??
rar 是专利格式 ,go 官方类库解压 rar 估计不会有 。
ZipFile 也不是 c#自带的吧
你们回什么贴啊,block 走人就是了。
需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限
go 语言怎么这么恶心。自动把账号功能收到的资金转账到楼主的账号,这么基础的功能都不能自动实现吗?
本来楼主就要实现万亿资产的目标,都怪 go 太垃圾。
你贴的代码有一定的安全性问题,可以参考我这个实现。
https://github.com/bookstairs/bookhunter/blob/master/internal/file/decompress.go
恩必
C:你在说什么? golang 这点代码都还不够我 zip 格式头逐字段解析呢?
有那么多库可以用,你这样自己找麻烦么
“这些示例需要将以下 NuGet 包添加到项目中:” 你仔细看看
java 不是一样的 正是因为这样才有很多轮子作者
shell 省事,可你嫌不 cool 啊
Java 可不一样
https://gist.github.com/oldshensheep/bea5bd4c313f27884bc87dced9917bf6
带完整的错误处理和流关闭处理,核心函数一共 19 行。
不,是你原来习惯的.Net 太实用了
已 block (善意提醒以后别回我的评论,我看不到的)
slice contain 、max 、min 也没有。
习惯就好。
仔细看过了, 并不需要导入任何 nuget 包
block 谁还不会啊, 已 block (善意提醒以后别回我的评论,我也看不到的)
只能说明 go 的生态还不行, 自带的标准库比不上 .net 和 java. 开源的工具库项目里, 很少有类似有基金会支持的开源项目, 代码质量和后续维护都令人担忧, 大家都不得不自己造轮子
有一说一, go 的标准库是真的简陋, 不好用. 就连个 decimal 标准库里都没有. 感觉设计实现标准库的人, 完全没有做过业务系统, api 的易用性完全是一点都不考虑, 唉…
go 的生态确实不太行,标准库太简陋了。不内置,官方出个工具包也行
golang 内置不行就是不行,为什么不敢承认呢
厨子不行怪灶台
在Golang中解压zip文件看似需要较多代码,这主要是因为Go标准库对zip文件的处理提供了较为细致和灵活的功能,以确保能够应对各种复杂的zip文件结构和内容。
首先,Go的archive/zip
包提供了对zip文件格式的全面支持,包括读取zip文件中的多个条目(文件或目录)、解压单个或多个文件、处理压缩方法(如deflate、store等)以及文件权限等元数据。这些功能都需要相应的代码来实现。
其次,解压zip文件通常涉及多个步骤,如打开zip文件、读取文件头信息、创建目标目录结构、解压每个文件并写入到相应位置等。每个步骤都需要明确的代码来处理,以确保解压过程的正确性和完整性。
此外,Go语言强调代码的明确性和可读性,因此即使对于常见的操作,也可能需要编写相对较多的代码来清晰地表达意图和逻辑。
虽然解压zip文件的代码可能看起来较多,但这也是Go语言注重安全和灵活性的体现。通过仔细阅读和理解这些代码,你可以更好地掌握Go语言处理zip文件的方法和技巧,并在实际应用中灵活运用它们。
总的来说,虽然Go语言解压zip文件的代码较多,但这正是为了确保能够可靠地处理各种复杂的zip文件,并提供灵活的功能来满足不同的需求。