压缩、复制文件(夹)
package helper
import (
"archive/zip"
"io"
"io/ioutil"
"os"
"path"
)
func CopyAllFile(dst, src string) (err error) {
ok, err := IsDir(src)
if err != nil {
return err
}
if ok {
projectFiles, err2 := ioutil.ReadDir(src)
if err2 != nil {
return err2
}
for _, projectFile := range projectFiles {
fileName := projectFile.Name()
newSrcFile := path.Join(src, fileName)
newDstFile := path.Join(dst, fileName)
isok, _ := PathExists(dst)
if !isok {
err = os.MkdirAll(dst, 0766)
if err != nil {
return err
}
}
err3 := CopyAllFile(newDstFile, newSrcFile)
if err3 != nil {
return err3
}
}
} else {
_, err = CopyFile(dst, src)
if err != nil {
return err
}
}
return nil
}
func CopyFile(dstName, srcName string) (written int64, err error) {
src, err := os.Open(srcName)
if err != nil {
return -1, err
}
defer src.Close()
dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0766)
if err != nil {
return -1, err
}
defer dst.Close()
return io.Copy(dst, src)
}
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func Compress(src string, dest string) error {
f, err := os.Open(src)
if err != nil {
return err
}
defer f.Close()
var files = []*os.File{f}
d, _ := os.Create(dest)
defer d.Close()
w := zip.NewWriter(d)
defer w.Close()
for _, file := range files {
err := compress(file, "", w)
if err != nil {
return err
}
}
return nil
}
func compress(file *os.File, prefix string, zw *zip.Writer) error {
info, err := file.Stat()
if err != nil {
return err
}
if info.IsDir() {
prefix = prefix + "/" + info.Name()
fileInfos, err := file.Readdir(-1)
if err != nil {
return err
}
for _, fi := range fileInfos {
f, err := os.Open(file.Name() + "/" + fi.Name())
if err != nil {
return err
}
err = compress(f, prefix, zw)
if err != nil {
return err
}
}
} else {
header, err := zip.FileInfoHeader(info)
header.Name = prefix + "/" + header.Name
if err != nil {
return err
}
writer, err := zw.CreateHeader(header)
if err != nil {
return err
}
_, err = io.Copy(writer, file)
file.Close()
if err != nil {
return err
}
}
return nil
}