The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
bthulu

golang 咋这么恶心,解压 zip 文件居然要一大串代码,这不应该是语言内置一行搞定的吗?

  •  
  •   bthulu · Dec 3, 2022 · 11279 views
    This topic created in 1442 days ago, the information mentioned may be changed or developed.

    这简直不能忍啊

    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
    }
    
    50 replies  •  2022-12-26 15:07:14 +08:00
    XieGP
    XieGP
    Dec 3, 2022❤️2
    1
    py 写多了吗:)
    loolac
    loolac
    Dec 3, 2022
    2
    当然,还需要一台电脑 ~
    ChrisFreeMan
    ChrisFreeMan
    Dec 3, 2022❤️3
    3
    真正的逻辑代码也没几行,大部分都是错误处理和 IO 释放
    GeruzoniAnsasu
    GeruzoniAnsasu
    Dec 3, 2022
    4
    C: ……
    yazinnnn
    yazinnnn
    Dec 3, 2022❤️1
    5
    ?迷惑发言
    wwqgtxx
    wwqgtxx
    Dec 3, 2022❤️7
    6
    今日迷惑行为大赏
    icepie
    icepie
    Dec 3, 2022❤️24
    7
    Golang 版
    Unzip("source", "target")
    yazinnnn
    yazinnnn
    Dec 3, 2022❤️1
    8
    楼主发的这些帖子看上去跟个流量号似的
    ClarkAbe
    ClarkAbe
    Dec 3, 2022 via Android
    9
    zz 发言......自个封装一个就能实现, 你要是懒得封装只能说你不要用这种接近底层的语言了....去 py 吧
    HugoChao
    HugoChao
    Dec 3, 2022
    10
    你代码都有了为什么不封装一下呢
    oldshensheep
    oldshensheep
    Dec 3, 2022❤️8
    11
    因为
    if err != nil {
    return err
    }
    C0VN
    C0VN
    Dec 3, 2022
    12
    你写一个包给大家用不就好了。
    Jooooooooo
    Jooooooooo
    Dec 3, 2022
    13
    golang 的 Unzip 不也是一行?
    QI41mOpKTG3jLhDt
    QI41mOpKTG3jLhDt
    Dec 3, 2022
    14
    把这里面封一层再调用不就行了吗
    liuidetmks
    liuidetmks
    Dec 3, 2022 via iPhone
    15
    c 不是更麻烦?
    deorth
    deorth
    Dec 3, 2022 via Android
    16
    要在脑子里打开
    swulling
    swulling
    Dec 3, 2022 via iPhone❤️1
    17
    https://github.com/artdarek/go-unzip

    随便找个库就行,go 标准库有些比较底层
    shakukansp
    shakukansp
    Dec 3, 2022
    18
    ???
    yanqiyu
    yanqiyu
    Dec 3, 2022❤️16
    19
    Go 语言并没有将解压 zip 文件作为语言内置的功能,这是因为 Go 的设计理念是尽可能保持简单,而不是提供尽可能多的功能。因此,如果你需要在 Go 中解压 zip 文件,就需要使用第三方库来实现这个功能。这些库通常都提供了一些简单的函数,可以让你在 Go 代码中很容易地解压 zip 文件。比如,你可以使用 Go 语言内置的 "archive/zip" 包来解压 zip 文件,它提供了一个名为" Unzip "的函数,可以让你很容易地解压 zip 文件。

    不是我说的,是 ChatAI 说的🐶
    https://twitter.com/clowwindy/status/1598979812831657984/photo/1
    infinityv
    infinityv
    Dec 3, 2022 via iPhone❤️3
    20
    @yanqiyu #19 chatgpt 今天给我说 go 是一门动态语言,我说你特么扯淡呢吧,然后他就向我道歉,说我是对的。
    seakingii
    seakingii
    Dec 3, 2022❤️1
    21
    c#的这个函数方法也是语言内置的,是.NET 类库里的. 语言和库都搞不清楚....
    dw2693734d
    dw2693734d
    Dec 3, 2022
    22
    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
    MMMMMMMMMMMMMMMM
    Dec 3, 2022❤️1
    23
    不想造轮子就找 lib 呗,多简单一事

    小编这边推荐你使用易语言哦,不仅也只需要一行,还是中文的哦~
    ghostwind
    ghostwind
    Dec 3, 2022
    24
    go 真正麻烦的解压缩 rar 文件
    LykorisR
    LykorisR
    Dec 3, 2022
    25
    ??
    liaohongxing
    liaohongxing
    Dec 3, 2022
    26
    rar 是专利格式 ,go 官方类库解压 rar 估计不会有 。
    liubaicai
    liubaicai
    Dec 3, 2022
    27
    ZipFile 也不是 c#自带的吧
    leavic
    leavic
    Dec 3, 2022❤️2
    28
    你们回什么贴啊,block 走人就是了。
    seakingii
    seakingii
    Dec 3, 2022
    30
    @mmdsun 这只是官方实现的库,不是"C#语言自带的功能"...
    微软官方实现的库确实用起来方便,比如 File.WriteAllText , 一次性写入文本到一个文件,也很方便,但和"C#语言自带"这个概念不相符,其实用 VB.NET 一样可以用这些函数,只要.NET 支持的语言都可以.
    seakingii
    seakingii
    Dec 3, 2022
    31
    需求是无穷无尽的,官方也只能挑着实现了,人力毕竟有限
    djoiwhud
    djoiwhud
    Dec 4, 2022 via Android
    32
    go 语言怎么这么恶心。自动把账号功能收到的资金转账到楼主的账号,这么基础的功能都不能自动实现吗?

    本来楼主就要实现万亿资产的目标,都怪 go 太垃圾。
    ewBuyVmLZMZE
    ewBuyVmLZMZE
    Dec 4, 2022
    33
    你贴的代码有一定的安全性问题,可以参考我这个实现。

    https://github.com/bookstairs/bookhunter/blob/master/internal/file/decompress.go
    changyang
    changyang
    Dec 4, 2022
    34
    @yanqiyu 恩必
    LANB0
    LANB0
    Dec 4, 2022
    35
    C:你在说什么? golang 这点代码都还不够我 zip 格式头逐字段解析呢?
    vanton
    vanton
    Dec 4, 2022
    36
    有那么多库可以用,你这样自己找麻烦么
    liubaicai
    liubaicai
    Dec 4, 2022
    37
    @mmdsun “这些示例需要将以下 NuGet 包添加到项目中:” 你仔细看看
    blankmiss
    blankmiss
    Dec 4, 2022
    38
    java 不是一样的 正是因为这样才有很多轮子作者
    JohnBull
    JohnBull
    Dec 4, 2022
    39
    shell 省事,可你嫌不 cool 啊
    oldshensheep
    oldshensheep
    Dec 4, 2022
    40
    @blankmiss Java 可不一样
    https://gist.github.com/oldshensheep/bea5bd4c313f27884bc87dced9917bf6
    带完整的错误处理和流关闭处理,核心函数一共 19 行。
    Fuhuang
    Fuhuang
    Dec 4, 2022
    41
    不,是你原来习惯的.Net 太实用了
    adoyle
    adoyle
    Dec 4, 2022❤️1
    42
    已 block (善意提醒以后别回我的评论,我看不到的)
    lincanbin
    lincanbin
    Dec 4, 2022
    43
    slice contain 、max 、min 也没有。
    习惯就好。
    bthulu
    bthulu
    OP
    Dec 5, 2022
    44
    @liubaicai 仔细看过了, 并不需要导入任何 nuget 包
    bthulu
    bthulu
    OP
    Dec 5, 2022
    45
    @adoyle block 谁还不会啊, 已 block (善意提醒以后别回我的评论,我也看不到的)
    dragonsunmoon
    dragonsunmoon
    Dec 5, 2022
    46
    只能说明 go 的生态还不行, 自带的标准库比不上 .net 和 java. 开源的工具库项目里, 很少有类似有基金会支持的开源项目, 代码质量和后续维护都令人担忧, 大家都不得不自己造轮子
    dragonsunmoon
    dragonsunmoon
    Dec 5, 2022
    47
    有一说一, go 的标准库是真的简陋, 不好用. 就连个 decimal 标准库里都没有. 感觉设计实现标准库的人, 完全没有做过业务系统, api 的易用性完全是一点都不考虑, 唉...
    blsm
    blsm
    Dec 7, 2022
    48
    go 的生态确实不太行,标准库太简陋了。不内置,官方出个工具包也行
    chinaufo
    chinaufo
    Dec 19, 2022
    49
    golang 内置不行就是不行,为什么不敢承认呢
    allgy
    allgy
    Dec 26, 2022
    50
    厨子不行怪灶台
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1785 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 107ms · UTC 04:58 · PVG 12:58 · LAX 20:58 · JFK 23:58
    ♥ Do have faith in what you're doing.