如何正確地將文件壓縮到包含子目錄的文件夾中。我有一個具有以下結(jié)構(gòu)的本地文件夾:folder/hello/folder/hello/world/folder/hello/world/helloword.txtfolder/index.txt這是我的代碼:package mainimport ( "archive/zip" "fmt" "io" "os" "path/filepath")func main() { files, err := listFiles("./folder") if err != nil { panic(err) } zipMe(files, "test.zip") for _, f := range files { fmt.Println(f) } fmt.Println("Done!")}func listFiles(root string) ([]string, error) { var files []string err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { files = append(files, path) return nil }) if err != nil { return nil, err } return files, nil}func zipMe(filepaths []string, target string) error { flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC file, err := os.OpenFile(target, flags, 0644) if err != nil { return fmt.Errorf("Failed to open zip for writing: %s", err) } defer file.Close() zipw := zip.NewWriter(file) defer zipw.Close() for _, filename := range filepaths { if err := addFileToZip(filename, zipw); err != nil { return fmt.Errorf("Failed to add file %s to zip: %s", filename, err) } } return nil}func addFileToZip(filename string, zipw *zip.Writer) error { file, err := os.Open(filename) if err != nil { return fmt.Errorf("Error opening file %s: %s", filename, err) } defer file.Close() wr, err := zipw.Create(filename) if err != nil { return fmt.Errorf("Error adding file; '%s' to zip : %s", filename, err) } if _, err := io.Copy(wr, file); err != nil { return fmt.Errorf("Error writing %s to zip: %s", filename, err) } return nil}這會創(chuàng)建一個無法提取的損壞的 zip(我在 mac os 上運行,但這應(yīng)該沒有什么區(qū)別)。我還嘗試了來自 stackoverflow 的其他幾個示例和通過 google 找到的鏈接,但我總是得到一個損壞的 zip。當(dāng)我提取它時,我得到一個 135 字節(jié)的 zip,我得到 1 個 0 字節(jié)的二進制文件)。如果有人可以幫助我找出我在這里缺少的東西,那就太好了。
1 回答

蕭十郎
TA貢獻1815條經(jīng)驗 獲得超13個贊
您需要列出并壓縮文件,而不是目錄。只需進行此調(diào)整即可忽略listFiles
函數(shù)中的目錄。
if !info.IsDir() { files = append(files, path) }
- 1 回答
- 0 關(guān)注
- 250 瀏覽
添加回答
舉報
0/150
提交
取消