archive/tar

package main

import (

"archive/tar"
"io"
"io/ioutil"
"log"
"os"
"path"

)

func main() {

//TarDynamicContent()
//UnTar("D:/home/mytar.tar", "D:/home/mytar/")
TarExistFile("D:/home/gif/111.gif")

}

func UnTar(srcTar string, dstDir string) {

// 清理路径字符串
dstDir = path.Clean(dstDir) + "/"

// 打开要解包的文件
fr, er := os.Open(srcTar)
if er != nil {
    log.Fatalln(er)
}
defer fr.Close()

// 创建 tar.Reader,准备执行解包操作
tr := tar.NewReader(fr)

// 遍历包中的文件
for hdr, er := tr.Next(); er != io.EOF; hdr, er = tr.Next() {
    if er != nil {
        log.Fatalln(er)
        continue
    }

    // 获取文件信息
    fi := hdr.FileInfo()

    // 获取绝对路径
    dstFullPath := dstDir + hdr.Name

    if hdr.Typeflag == tar.TypeDir {
        // 创建目录
        os.MkdirAll(dstFullPath, fi.Mode().Perm())
        // 设置目录权限
        os.Chmod(dstFullPath, fi.Mode().Perm())
    } else {
        // 创建文件所在的目录
        os.MkdirAll(path.Dir(dstFullPath), os.ModePerm)
        // 将 tr 中的数据写入文件中
        if er := unTarFile(dstFullPath, tr); er != nil {
            log.Fatalln(er)
        }
        // 设置文件权限
        os.Chmod(dstFullPath, fi.Mode().Perm())
    }
}

}

// 因为要在 defer 中关闭文件,所以要单独创建一个函数
func unTarFile(dstFile string, tr *tar.Reader) error {

// 创建空文件,准备写入解包后的数据
fw, er := os.Create(dstFile)
if er != nil {
    return er
}
defer fw.Close()

// 写入解包后的数
_, er = io.Copy(fw, tr)
if er != nil {
    return er
}

return nil

}

func TarExistFile(srcPath string) {

// 创建空的目标文件
fw, _ := os.Create("D:/home/mytar-file.tar")
defer fw.Close()

// 创建 tar.Writer,执行打包操作
tw := tar.NewWriter(fw)
defer func() {
    tw.Flush()
    tw.Close()
}()

// 获取文件或目录信息
fi, _ := os.Stat(srcPath)
// 获取要打包的文件或目录的所在位置(parent dir) 和 名称
parentDir, dirOrFileName := path.Split(path.Clean(srcPath))
// 开始打包
if fi.IsDir() {
    tarDir(parentDir, dirOrFileName, tw, fi)
} else {
    tarFile(parentDir, dirOrFileName, tw, fi)
}

}

// 因为要执行遍历操作,所以要单独创建一个函数
func tarDir(parentDir, dirName string, tw *tar.Writer, fi os.FileInfo) {

// 写入目录信息
if len(dirName) > 0 {
    hdr, _ := tar.FileInfoHeader(fi, "")
    hdr.Name = dirName
    tw.WriteHeader(hdr)
}

dirFull := parentDir + dirName + "/"
// 获取 srcFull 下的文件或子目录列表
fis, _ := ioutil.ReadDir(dirFull)
// 开始遍历
for _, nfi := range fis {
    if nfi.IsDir() {
        tarDir(parentDir, dirName+"/"+nfi.Name(), tw, nfi)
    } else {
        tarFile(parentDir, dirName+"/"+nfi.Name(), tw, nfi)
    }
}

}

// 因为要在 defer 中关闭文件,所以要单独创建一个函数
func tarFile(fileDir, filename string, tw *tar.Writer, fi os.FileInfo) {

// 获取完整路径
filepath := fileDir + filename
log.Println("file: ", filepath)

// 写入文件信息
hdr, _ := tar.FileInfoHeader(fi, "")
hdr.Name = filename
tw.WriteHeader(hdr)
fb, _ := ioutil.ReadFile(filepath)
tw.Write(fb)

}

func TarDynamicContent() {

// 创建空的目标文件
fw, er := os.Create("D:/home/mytar.tar")
if er != nil {
    log.Fatalln(er)
}
defer fw.Close()

// 创建 tar.Writer,执行打包操作
tw := tar.NewWriter(fw)
defer func() {
    tw.Flush()
    // 这里要判断 tw 是否关闭成功,如果关闭失败,则 .tar 文件可能不完整
    if er := tw.Close(); er != nil {
        log.Fatalln(er)
    }
}()

//要打包的内容
var files = []struct {
    Name, Body string
}{
    {"readme.txt", "thie archive contains some text files"},
    {"gopher.txt", "Gopher names:\nGeorge \nGeoffrey\nGonzo"},
    {"todo.txt", "Get animal handling licence"},
}
//写入tar
for _, file := range files {
    hdr := &tar.Header{
        Name: file.Name,
        Size: int64(len(file.Body)),
    }

    if err := tw.WriteHeader(hdr); err != nil {
        log.Fatalln(err)
    }
    if _, err := tw.Write([]byte(file.Body)); err != nil {
        log.Fatalln(err)
    }
}

}

时间: 2024-10-12 20:57:27

archive/tar的相关文章

golang中archive/tar包用法

tar包实现对tar归档文件的访问,旨在覆盖大部分的类型,包括GNU和BSD产生的tars. 常量 const ( // Types TypeReg = '0' // 普通文件 TypeRegA = '\x00' // 普通文件 TypeLink = '1' // 硬连接 TypeSymlink = '2' // 符号连接,软连接 TypeChar = '3' // 字符设备节点 TypeBlock = '4' // 块设备节点 TypeDir = '5' // 目录 TypeFifo = '6

tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure status due to previous errors

解压一个.tar.zip文件时报错 tar -zxvf bcl2fastq2-v2-20-0-linux-x86-64.zip tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure status due to previous errors 解决办法: unzip bcl2fastq2-v2-20-0-tar.zip 生成 bcl2fastq2-v2.20

tar命令参数笔记

是指的linux下的tar命令,该命令的用法相当多,以下的内容来自tar的info手册 --numeric-owner This option will notify 'tar' thar it should use numeric user and group IDs when creating a 'tar' file, rather than names. This option allows (ANSI) archives to be written without user/group

Linux RPM、TAR包管理

一.RPM软件包命令的使用 RPM主要有5种基本操作模式:安装.卸载.刷新.升级及查询.下面分别介绍. 1.安装软件包 命令语法: rpm -ivh [RPM包文件名称] 命令中各参数的含义如下: -i:表示安装软件包. -v:表示在安装过程中显示详细的信息. -h:表示显示水平进度. 例1:安装 sqldeveloper-4.0.1.14.48-1.noarch.rpm软件包. [[email protected] ~]# rpm -ivh sqldeveloper-4.0.1.14.48-1

Linux tar command usage

Linux tar command usage */--> Linux tar command usage Table of Contents 1. Create an archive: 2. Create a gzipped archive: 3. List the files in an archive 4. Add a file or directory to an existing archive The frequently used tar command are listed as

TAR 命令

Create linux tar gz (Gzip) archive   (创建压缩文件) tar -czvf myarchive.tgz mydirectory/ We use the -t option to create an linux tar archive c – Creates a new .tar archive file. v – Verbosely(啰嗦地) show the .tar file progress. f – File name type of the arch

[转帖]15+ 个 tar 命令的用法,附示例

15+ 个 tar 命令的用法,附示例 http://www.oschina.net/question/12_146379 4月23日 武汉 OSC 源创会 —— ES6开发体系实践>>> »   tar 命令用来将很多文件打包成一个单一的磁带或者磁盘归档,并可从归档文件恢复出文件列表.当你需要通过 email 发送大量文件时或者传输文件时非常有用.这里我们介绍一些基本的使用场景. tar 的语法: ? 1 # tar [options] file.tar file1 file2 ..

tar 命令的详细参数

用tar对文件进行归档 tar -cf etc.tar /etc 使用-t列出归档文档中包含的文件 tar -tf etc.tar 需要显示详细归档文件列表 tar -tvf home.tar 向归档文件中添加文件 tar -rvf etc.tar /etc/passwd 从归档文件中提取文件或文件夹 tar -xvf archive.tar -C /path/to/extraction_directory 在tar中使用stdin和stdout tar cvf - files/ | ssh [

tar高级教程:增量备份、定时备份、网络备份

一.概述 备份与恢复对于系统维护而言是至关重要的事情.不合理的备份与还原会让你的数据面临丢失的风险.许多用户都在丢失重要数据后才意识到这种风险.而要从这种情况恢复数据将是非常耗时并且困难的.所以我们应该从别人的错误中吸取教训,并确保你的系统处于保护中.先考虑一些问题: 何时进行备份? 如果你可以接受一个星期的数据丢失,那么每周备份一次就足够了.但是如果你只能容忍一天的数据损失,那么你就必须每天晚上进行备份. 备份到哪? 显然备份到系统所在磁盘不是明智之举,用户应该备份到外接硬盘或者磁带上面. 为