Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1084625
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 746
  • 用 户 组: 普通用户
  • 注册时间: 2018-06-12 20:01
个人简介

寫写code、调調bug、填填坑,僅此而已。

文章分类

全部博文(80)

文章存档

2019年(30)

2018年(50)

分类: C/C++

2018-06-13 20:18:39

参考网上的实现,进行了修改,切实可用
1.压缩功能实现

点击(此处)折叠或打开

  1. func compress(file *os.File, prefix string, zw *zip.Writer) error {

  2.     info, err := file.Stat()
  3.     if err != nil {
  4.         slog.Error("解压压缩有误, " + err.Error())
  5.         return err
  6.     }
  7.     if info.IsDir() {
  8.         if prefix == "root" {
  9.             prefix = info.Name()
  10.         } else {
  11.             prefix = prefix + "/" + info.Name()
  12.         }

  13.         fileInfos, err := file.Readdir(-1)
  14.         if err != nil {
  15.             slog.Error("解压压缩有误, " + err.Error())
  16.             return err
  17.         }
  18.         for _, fi := range fileInfos {
  19.             f, err := os.Open(file.Name() + "/" + fi.Name())
  20.             if err != nil {
  21.                 slog.Error("解压压缩有误, " + err.Error())
  22.                 return err
  23.             }
  24.             err = compress(f, prefix, zw)
  25.             if err != nil {
  26.                 slog.Error("解压压缩有误, " + err.Error())
  27.                 return err
  28.             }
  29.         }

  30.     } else {
  31.         header, err := zip.FileInfoHeader(info)
  32.         if prefix == "root" {
  33.             header.Name = header.Name
  34.         } else {
  35.             header.Name = prefix + "/" + header.Name
  36.         }

  37.         if err != nil {
  38.             slog.Error("解压压缩有误, " + err.Error())
  39.             return err
  40.         }
  41.         writer, err := zw.CreateHeader(header)
  42.         if err != nil {
  43.             slog.Error("解压压缩有误, " + err.Error())
  44.             return err
  45.         }
  46.         _, err = io.Copy(writer, file)
  47.         file.Close()
  48.         if err != nil {
  49.             slog.Error("解压压缩有误, " + err.Error())
  50.             return err
  51.         }
  52.     }
  53.     return nil
  54. }
  55. func Compress(files []*os.File, dest string) error {
  56.     d, _ := os.Create(dest)
  57.     defer d.Close()
  58.     w := zip.NewWriter(d)
  59.     defer w.Close()
  60.     for _, file := range files {
  61.         err := compress(file, "root", w)
  62.         if err != nil {
  63.             slog.Error("解压压缩有误, " + err.Error())
  64.             return err
  65.         }
  66.     }
  67.     return nil
  68. }
2.解压功能实现

点击(此处)折叠或打开

  1. func DeCompress(zipFile, dest string) error {
  2.     reader, err := zip.OpenReader(zipFile)

  3.     if err != nil {
  4.         slog.Debug(err.Error())
  5.         return err
  6.     }
  7.     defer reader.Close()
  8.     for _, file := range reader.File {
  9.         rc, err := file.Open()
  10.         if err != nil {
  11.             slog.Debug(err.Error())
  12.             return err
  13.         }

  14.         defer rc.Close()
  15.         if file.FileInfo().IsDir() {
  16.             os.MkdirAll(dest+file.Name, file.Mode())
  17.             continue
  18.         } else {

  19.             filename := dest + file.Name
  20.             err = os.MkdirAll(getDir(filename), 0755)
  21.             if err != nil {
  22.                 slog.Debug(err.Error())
  23.                 return err
  24.             }
  25.             w, err := os.Create(filename)
  26.             if err != nil {
  27.                 slog.Debug(err.Error())
  28.                 return err
  29.             }
  30.             defer w.Close()
  31.             _, err = io.Copy(w, rc)
  32.             if err != nil {
  33.                 slog.Debug(err.Error())
  34.                 return err
  35.             }
  36.             w.Close()
  37.         }

  38.         rc.Close()

  39.     }
  40.     return nil
  41. }

阅读(3349) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~