复制与压缩文件(夹)

压缩、复制文件(夹)

// An highlighted block
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
}

//Compress 压缩文件 files 文件数组,可以是不同dir下的文件或者文件夹   dest 压缩文件存放地址
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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值