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

51 回复

py 写多了吗:)

更多关于Golang Go语言中为啥解压zip文件要这么多代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当然,还需要一台电脑 ~

真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放

C: ……

?迷惑发言

今日迷惑行为大赏

Golang 版
Unzip(“source”, “target”)

楼主发的这些帖子看上去跟个流量号似的

zz 发言…自个封装一个就能实现, 你要是懒得封装只能说你不要用这种接近底层的语言了…去 py 吧

你代码都有了为什么不封装一下呢

因为
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 走人就是了。

这只是官方实现的库,不是"C#语言自带的功能"…
微软官方实现的库确实用起来方便,比如 File.WriteAllText , 一次性写入文本到一个文件,也很方便,但和"C#语言自带"这个概念不相符,其实用 VB.NET 一样可以用这些函数,只要.NET 支持的语言都可以.

需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限

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 行。

已 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文件,并提供灵活的功能来满足不同的需求。

回到顶部