打包文件用到了tar包,其中tar包的用法可以参考API

golang提供了个函数用来遍历文件夹 filepath.Walk

函数具体描述如下:

func Walk(root string, walkFn WalkFunc) error  root是用遍历的文件夹

type WalkFunc

type WalkFunc func(path string, info os.FileInfo, err error) error path参数是返回遍历的文件路径和文件信息

在使用中如代码中蓝色部分,通过该方法呢,我们可以对文件和文件夹的操作更加熟悉,其中用到了

os.Create 用来创建文件,返回文件信息和错误信息  func Create(name string) (file *File, err error)
os.Remove 用来删除文件,返回错误信息  func Remove(name string) error
os.Stat   用来返回文件具体信息,返回文件信息和错误信息   func (f *File) Stat() (fi FileInfo, err error)
os.Open   用来打开文件,返回文件信息和错误信息    func Open(name string) (file *File, err error)
io.Copy   复职文件信息到Writer 

func Copy(dst Writer, src Reader) (written int64, err error)func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error)
os.Mkdir 用来创建文件夹,返回错误信息  func Mkdir(name string, perm FileMode) errorstrings.TrimPrefix(targetpath, directory) 这个方法获取具体的文件路径相对目标文件夹的相对路径,也是在tar包中创建文件夹的相对路径
package main

import (
    "archive/tar"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "strings"
)

/***生成***/

func createTar(filesource, filetarget string, deleteIfExist bool) error {
    //create tar file with targetfile name
    tarfile, err := os.Create(filetarget)

    if err != nil {
        // if file is exist then delete file
        if err == os.ErrExist {
            if err := os.Remove(filetarget); err != nil {
                fmt.Println(err)
                return err
            }
        } else {
            fmt.Println(err)
            return err
        }
    }
    defer tarfile.Close()

    tarwriter := tar.NewWriter(tarfile)

    sfileInfo, err := os.Stat(filesource)
    if err != nil {
        fmt.Println(err)
        return err
    }

    if !sfileInfo.IsDir() {
        return tarFile(filetarget, filesource, sfileInfo, tarwriter)

    } else {
        return tarFolder(filesource, tarwriter)
    }
    return nil
}

func tarFile(directory string, filesource string, sfileInfo os.FileInfo, tarwriter *tar.Writer) error {

    sfile, err := os.Open(filesource)

    if err != nil {
        panic(err)
        return err
    }
    defer sfile.Close()

    header, err := tar.FileInfoHeader(sfileInfo, "")
    if err != nil {
        fmt.Println(err)
        return err
    }
    header.Name = directory
    err = tarwriter.WriteHeader(header)
    if err != nil {
        fmt.Println(err)
        return err
    }
    //  can use buffer to copy the file to tar writer
    //    buf := make([]byte,15)
    //    if _, err = io.CopyBuffer(tarwriter, sfile, buf); err != nil {
    //        panic(err)
    //        return err
    //    }
    if _, err = io.Copy(tarwriter, sfile); err != nil {
        fmt.Println(err)
        panic(err)
        return err
    }
    return nil
}
func tarFolder(directory string, tarwriter *tar.Writer) error {

    var baseFolder string = filepath.Base(directory)
    //fmt.Println(baseFolder)
    return filepath.Walk(directory, func(targetpath string, file os.FileInfo, err error) error {
        //read the file failure
        if file == nil {
            panic(err)
            return err
        }
        if file.IsDir() {
            // information of file or folder
            header, err := tar.FileInfoHeader(file, "")
            if err != nil {
                return err
            }
            header.Name = filepath.Join(baseFolder, strings.TrimPrefix(targetpath, directory))
            fmt.Println(hdr.Name)
            if err = tarwriter.WriteHeader(header); err != nil {
                return err
            }
            os.Mkdir(strings.TrimPrefix(baseFolder, file.Name()), os.ModeDir)

            return nil

        } else {
            //baseFolder is the tar file path
            var fileFolder = filepath.Join(baseFolder, strings.TrimPrefix(targetpath, directory))
            return tarFile(fileFolder, targetpath, file, tarwriter)
        }
    })
}

  

golang 用tar打包文件或文件夹的更多相关文章

  1. linux中tar 打包指定路径文件

    linux中tar打包指定路径文件www.111cn.net 编辑:yahoo 来源:转载在linux系统中打包与解压文件我都可以使用tar命令来解决,只要使用不同的参数就可以实现不同的需要了,下面来 ...

  2. tar打包过滤某个文件及文件夹

    ip=ip add|grep eth0|grep -i inet|awk '{print $2}'|cut -d '/' -f 1 cd /data tar -zvcf `echo $ip`_`dat ...

  3. tar打包排除某个文件夹

    tar -zcvf package.tar.gz --exclude package/logs --exclude package/runtime ./package 使用exclude关键字设置需要 ...

  4. tar 打包当前目录下文件但不包括该录

    今天想打包一些文件,但是不想把该目录打包进去 比如我想把test目录下文件打个包,安装正常的命令来 tar zcf test.tar.gz test 这样肯定会把test目录也打进去,解压后肯定是te ...

  5. tar打包如何不打包某一个文件夹(排除某些文件夹)

    tar打包如何不打包某一个文件夹(排除某些文件夹) 问题描述: 最近想备份一下Tomcat运行的的功能文件,以防特殊情况的发生.但是在实际操作的过程中发现,可能是由于Unix/Linux版本太老的原因 ...

  6. linux下打包文件或文件夹

    转自:    在linux下如何将文件夹打包                 http://blog.csdn.net/cynhafa/article/details/7303338 linux zi ...

  7. tar 打包处理文件

    基本格式:tar [Options] file_archive //注意tar的第一参数必须为命令选项,即不能直接接待处理文件 Option是由三部分组成,分别是操作类型(创建,查看,解压),压缩处理 ...

  8. 使用Java API进行tar.gz文件及文件夹压缩解压缩

    在java(JDK)中我们可以使用ZipOutputStream去创建zip压缩文件,(参考我之前写的文章 使用java API进行zip递归压缩文件夹以及解压 ),也可以使用GZIPOutputSt ...

  9. Linux tar (打包.压缩.解压缩)命令说明 | tar如何解压文件到指定的目录?

    打包举例:将 /usr/local/src/zlib-1.2.5目录下的文件打包成 zlib-1.2.5.tar.gz cd /usr/local/src tar -czvf ./zlib-1.2.5 ...

随机推荐

  1. c++简单编写线性表(实验)

    哇 好久没更博客了  因为从上次更文到现在为止,我一直在学c#,然后也觉得没什么太大的东西想写在博客上, 总之这次就简单的传一下学校安排的数据结构的实验,我还是学生,是新手,希望能继续跟大家一起学习, ...

  2. C. Kyoya and Colored Balls(Codeforces Round #309 (Div. 2))

    C. Kyoya and Colored Balls Kyoya Ootori has a bag with n colored balls that are colored with k diffe ...

  3. freemarker四种变量

    freemarker四种变量 1.简单介绍说明 (1)数据模型中的变量:root中的变量 (2)模板中的变量:使用<#assign>定义的变量 (3)局部变量:在指令中的变量 (4)循环变 ...

  4. 泛泰A870(高通APQ8064t 600 cpu) Mokee4.4.2(Android4.4) 图赏

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3lob3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  5. webpack+babel+transform-runtime, IE下提示Promise未定义?

    知识要求 babel的基础知识(推荐阮一峰的babel入门教程) 充分理解babel-plugin-transform-runtime与babel-runtime的作用(推荐github项目首页) w ...

  6. python 创建列表和向列表添加元素方法

    今天的学习内容是python中的列表的相关内容. 一.创建列表 1.创建一个普通列表 >>> tabulation1 = ['大圣','天蓬','卷帘'] >>> ...

  7. 【SqlServer】JSON函数

    1   概述 本篇文件将结合MSND简要分析Sqlserver中JSON函数,主要包括ISJSON,JSON_VALUE,JSON_MODIFY,JSON_QUERY. 2   具体内容 2.1  J ...

  8. ASP.NET Core 指定环境发布(hosting environment)

    ASP.NET Core 应用程序发布命令: dotnet publish [<PROJECT>] [-f|--framework] [-r|--runtime] [-o|--output ...

  9. 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。

    更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有

  10. list.add(),向List集合插入对象报空指针异常

    开始的时候我没有判断添加的随想是否为空,直接add;后来加了一个判断,判断了对象不等于空,但是运行程序还是报空指针,这时我发现应该是List出问题了: 查了下资料,发现我初始化List方法不对,如果只 ...