打包文件用到了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. 采用Opserver来监控你的ASP.NET项目系列(一、Opserver监控的简介与平台搭建)

    前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来讲讲如何监控我们的ASP.NET项目. 首先我们来介绍一下,什么是Opserver,它是Stack ...

  2. tyvj4877 组合数

    1.组合数 (zero.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 从m个不同元素中,任取n(n≤m)个元素并成一组,叫做从m个不同元素中取出n个元素的一个组合:从m个不 ...

  3. Backtrack无线攻防(很任性的一篇)

    首先你得有一个backtrack操作系统 然后还得花钱买一个无线网卡,最好是Intel的,还有要是USB接口的,可能是因为其他接口我不会接.

  4. VBScripts and UAC elevation(visa以后的系统)

    这两天由于工作须要.在写一些vbs的脚本,才知道.vbs不能像其它可运行文件一样.在 须要提升訪问权限时.弹出UAC窗体.那么,怎样通过UAC提升vbs脚本的訪问权限呢? 查了一些资料,将结果整理一下 ...

  5. Linux计划任务crontab

    Linux系统中存在两种工作调度的方式 周期性的(at),每隔一个固定的周期要来办的事项: 一次性的(crontab),做完一次以后就不会再执行: at at是个可以处理仅执行一次就结束调度的指令,不 ...

  6. IdentityServer(12)- 使用 ASP.NET Core Identity

    IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...

  7. MAC系统里JDK版本切换

    1.首先安装需要的JDK版本 JDK7,JDK8则需要自己到Oracle官网下载安装对应的版本.自己安装的JDK默认路径为:/Library/Java/JavaVirtualMachines/jdk1 ...

  8. 【二十五】cookie与session学习总结

    一:cookie 1.创建cookie 关键字:setcookie 用于保存cookie 原理:当浏览器访问cookie.php页面时,我们的服务器就会以set-cookie的方式将cookie信息回 ...

  9. Linux简介,虚拟机安装,网络设置,桌面和vim安装

    Linux简介: linux代表系统内核.Linux系统指基于Linux内核的操作系统,由内核和程序结合组成.比较流行的发行版本由RedHat Linux.Fedora.Centos.Debian.U ...

  10. 浅谈,html\css脱离标准文档流相关

    (个人知识有限,难免有误,请见谅) 标准文档流,顾名思义,是要按照一定规矩排列的,默认的就是元素会从左至右,从上至下排列,块级会独占一行,行内元素会和小伙伴们共享一行. 本来在标准文档流下,各个元素相 ...