亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang - 壓縮一個包含空子目錄和文件的目錄

Golang - 壓縮一個包含空子目錄和文件的目錄

Go
嚕嚕噠 2022-10-24 08:56:14
我正在嘗試壓縮包含一些空子目錄的現有目錄。這是文件夾結構。parent/├── child│   └── child.txt├── empty-folder└── parent.txt2 directories, 2 files這是源代碼。它寫入所有有文件的子目錄。但它跳過了一個空的子目錄。有沒有辦法在 zip 文件中添加一個空子目錄?提前致謝。package mainimport (    "archive/zip"    "fmt"    "io"    "os"    "path/filepath")// check for error and stop the executionfunc checkForError(err error) {    if err != nil {        fmt.Println("Error - ", err)        os.Exit(1)    }}const (    ZIP_FILE_NAME    = "example.zip"    MAIN_FOLDER_NAME = "parent")// Main functionfunc main() {    var targetFilePaths []string    // get filepaths in all folders    err := filepath.Walk(MAIN_FOLDER_NAME, func(path string, info os.FileInfo, err error) error {        if info.IsDir() {            return nil        }        // add all the file paths to slice        targetFilePaths = append(targetFilePaths, path)        return nil    })    checkForError(err)    // zip file logic starts here    ZipFile, err := os.Create(ZIP_FILE_NAME)    checkForError(err)    defer ZipFile.Close()    zipWriter := zip.NewWriter(ZipFile)    defer zipWriter.Close()    for _, targetFilePath := range targetFilePaths {        file, err := os.Open(targetFilePath)        checkForError(err)        defer file.Close()        // create path in zip        w, err := zipWriter.Create(targetFilePath)        checkForError(err)        // write file to zip        _, err = io.Copy(w, file)        checkForError(err)    }}
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

要編寫一個空目錄,您只需要Create使用帶有尾隨路徑分隔符的目錄路徑進行調用。


package main


import (

    "archive/zip"

    "fmt"

    "io"

    "log"

    "os"

    "path/filepath"

)


const (

    ZIP_FILE_NAME    = "example.zip"

    MAIN_FOLDER_NAME = "parent"

)


type fileMeta struct {

    Path  string

    IsDir bool

}


func main() {

    var files []fileMeta

    err := filepath.Walk(MAIN_FOLDER_NAME, func(path string, info os.FileInfo, err error) error {

        files = append(files, fileMeta{Path: path, IsDir: info.IsDir()})

        return nil

    })

    if err != nil {

        log.Fatalln(err)

    }


    z, err := os.Create(ZIP_FILE_NAME)

    if err != nil {

        log.Fatalln(err)

    }

    defer z.Close()


    zw := zip.NewWriter(z)

    defer zw.Close()


    for _, f := range files {

        path := f.Path

        if f.IsDir {

            path = fmt.Sprintf("%s%c", path, os.PathSeparator)

        }


        w, err := zw.Create(path)

        if err != nil {

            log.Fatalln(err)

        }


        if !f.IsDir {

            file, err := os.Open(f.Path)

            if err != nil {

                log.Fatalln(err)

            }

            defer file.Close()


            if _, err = io.Copy(w, file); err != nil {

                log.Fatalln(err)

            }

        }

    }

}


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號