liuxiaolong
2020-05-29 0bb9a4c37862e5098a596e121fb13fd12c2ca44f
extend/util/zip.go
@@ -5,10 +5,13 @@
   "basic.com/valib/logger.git"
   "compress/gzip"
   "errors"
   "fmt"
   "io"
   "io/ioutil"
   "log"
   "os"
   "path"
   "path/filepath"
   "strings"
)
@@ -26,7 +29,7 @@
   logger.Debug("文件名称是", FileName)
   //创建存放压缩文件的路径(如果文件夹不存在)
   if !dirExists(DesPathName) {
   if !DirExists(DesPathName) {
      os.MkdirAll(DesPathName, 0777)
   }
   logger.Debug("创建文件")
@@ -121,11 +124,11 @@
   // 清理路径字符串
   src = path.Clean(src)
   // 判断要打包的文件或目录是否存在
   if !exists(src) {
   if !Exists(src) {
      return errors.New("要打包的文件或目录不存在:" + src)
   }
   // 判断目标文件是否存在
   if fileExists(dstTar) {
   if FileExists(dstTar) {
      if failIfExist { // 不覆盖已存在的文件
         return errors.New("目标文件已经存在:" + dstTar)
      } else { // 覆盖已存在的文件
@@ -296,19 +299,87 @@
}
// 判断档案是否存在
func exists(name string) bool {
func Exists(name string) bool {
   _, err := os.Stat(name)
   return err == nil || os.IsExist(err)
}
// 判断文件是否存在
func fileExists(filename string) bool {
func FileExists(filename string) bool {
   fi, err := os.Stat(filename)
   return (err == nil || os.IsExist(err)) && !fi.IsDir()
}
// 判断目录是否存在
func dirExists(dirname string) bool {
func DirExists(dirname string) bool {
   fi, err := os.Stat(dirname)
   return (err == nil || os.IsExist(err)) && fi.IsDir()
}
}
//文件夹复制
func CopyDir(src string, dest string) {
   src_original := src
   err := filepath.Walk(src, func(src string, f os.FileInfo, err error) error {
      if f == nil {
         return err
      }
      if f.IsDir() {
         CopyDir(f.Name(), dest+"/"+f.Name())
      } else {
         fmt.Println(src)
         fmt.Println(src_original)
         fmt.Println(dest)
         dest_new := strings.Replace(src, src_original, dest, -1)
         fmt.Println(dest_new)
         fmt.Println("CopyFile:" + src + " to " + dest_new)
         CopyFile(src, dest_new)
      }
      return nil
   })
   if err != nil {
      fmt.Printf("filepath.Walk() returned %v\n", err)
   }
}
//大文件复制
func CopyFile(srcFileName string, dstFileName string) {
   //打开源文件
   srcFile, err := os.Open(srcFileName)
   if err != nil {
      log.Fatalf("源文件读取失败,原因是:%v\n", err)
   }
   defer func() {
      err = srcFile.Close()
      if err != nil {
         log.Fatalf("源文件关闭失败,原因是:%v\n", err)
      }
   }()
   //创建目标文件,稍后会向这个目标文件写入拷贝内容
   distFile, err := os.Create(dstFileName)
   if err != nil {
      log.Fatalf("目标文件创建失败,原因是:%v\n", err)
   }
   defer func() {
      err = distFile.Close()
      if err != nil {
         log.Fatalf("目标文件关闭失败,原因是:%v\n", err)
      }
   }()
   //定义指定长度的字节切片,每次最多读取指定长度
   var tmp = make([]byte, 1024*4)
   //循环读取并写入
   for {
      n, err := srcFile.Read(tmp)
      n, _ = distFile.Write(tmp[:n])
      if err != nil {
         if err == io.EOF {//读到了文件末尾,并且写入完毕,任务完成返回(关闭文件的操作由defer来完成)
            return
         } else {
            log.Fatalf("拷贝过程中发生错误,错误原因为:%v\n", err)
         }
      }
   }
}