如何正确将文件压缩到带有子目录的文件夹中。
我有一个具有以下结构的本地文件夹:
folder/hello/
folder/hello/world/
folder/hello/world/helloword.txt
folder/index.txt
这是我的代码:
package main
import (
"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
}
这将创建一个无法解压缩的损坏的zip(我在mac os上运行,但这没有什么关系)。 我也尝试了stackoverflow和其他通过谷歌找到的链接的其他几个例子,但是我总是得到一个损坏的zip。提取时,我得到一个135字节的zip压缩文件,得到1个0字节的二进制文件。
如果有人能帮助我找出我在这里想念的地方,那就太好了。
Thx
答案 0 :(得分:0)
您需要列出并压缩文件,而不是目录。只需进行此调整即可忽略listFiles
函数中的目录。
if !info.IsDir() {
files = append(files, path)
}