golang之用archive/tar将文件或者目录打包和解包的实现

简单介绍及说明

golang代码可以tar 目录和文件的,并且tar包是以要打包的文件或者目录名字命名tar包,如果是打包目录,目录结构和里面的文件也可以递归打包

如下面示例代码tar.go中

sourceDir := "/root/test_tar/"
targetDir := "/root/test_untar/"

sourceTar := "/root/test_untar/test_tar.tar.gz"
targetUnTarDir := "/root/test_untar/"

打包:我将test_tar打包成test_tar.tar.gz保存在/root/test_untar/

解包:我将刚才打包的/root/test_untar/test_tar.tar.gz解包到/root/test_untar/

提示:目标目录不可以包含在源目录内,否则会造成递归打包

解压到保存目录必须是个目录

代码示例 tar.go

package main

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

func Tar(source, target string) error {
        filename := filepath.Base(source)
        target = filepath.Join(target, fmt.Sprintf("%s.tar.gz", filename))

        tarfile, err := os.Create(target)
        if err != nil {
                return err
        }
        defer tarfile.Close()

        tarball := tar.NewWriter(tarfile)
        defer tarball.Close()

        info, err := os.Stat(source)
        if err != nil {
                return nil
        }

        var baseDir string
        if info.IsDir() {
                baseDir = filepath.Base(source)
        }
     
        return filepath.Walk(source,
                func(path string, info os.FileInfo, err error) error {
                        if err != nil {
                                return err
                        }
                        header, err := tar.FileInfoHeader(info, info.Name())
                        if err != nil {
                                return err
                        }

                        if baseDir != "" {
                                header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
                        }

                        if err := tarball.WriteHeader(header); err != nil {
                                return err
                        }

                        if info.IsDir() {
                                return nil
                        }

                        file, err := os.Open(path)
                        if err != nil {
                                return err
                        }
                        defer file.Close()
                        _, err = io.Copy(tarball, file)
                        return err
                })
}

func UnTar(tarball, target string) error {
        reader, err := os.Open(tarball)
        if err != nil {
                return err
        }
        defer reader.Close()
        tarReader := tar.NewReader(reader)

        for {
                header, err := tarReader.Next()
                if err == io.EOF {
                        break
                } else if err != nil {
                        return err
                }

                path := filepath.Join(target, header.Name)
                info := header.FileInfo()
                if info.IsDir() {
                        if err = os.MkdirAll(path, info.Mode()); err != nil {
                                return err
                        }
                        continue
                }

                file, err:= os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode())
                if err != nil {
                        return err
                }
                defer file.Close()
                _, err =io.Copy(file, tarReader)
                if err != nil {
                        return err
                }
        }
        return nil
}


func main() {


        sourceDir := "/root/test_tar/"
        targetDir := "/root/test_untar/"

        if err := Tar(sourceDir, targetDir); err != nil {
                fmt.Printf("tar failed %s\n", err.Error())
        }


        sourceTar := "/root/test_untar/test_tar.tar.gz"
        targetUnTarDir := "/root/test_untar/"

        if err := UnTar(sourceTar,targetUnTarDir); err != nil {
                fmt.Printf("Untar failed %s\n",err.Error())
        }


}

程序测验

程序执行前:

执行go run tar.go之后

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要使用 Golang 编写一个安装脚本,用于安装 Nginx、MySQL 和 ModSecurity。可以使用 Go 的 `os/exec` 来调用系统命令进行安装和配置。 以下是一个简单的示例脚本,用于在 Windows 系统上安装 Nginx、MySQL 和 ModSecurity。 ```go package main import ( "fmt" "os/exec" ) func main() { // 安装 Nginx cmd := exec.Command("choco", "install", "nginx") err := cmd.Run() if err != nil { fmt.Println("Error installing Nginx:", err) return } // 安装 MySQL cmd = exec.Command("choco", "install", "mysql") err = cmd.Run() if err != nil { fmt.Println("Error installing MySQL:", err) return } // 安装 ModSecurity cmd = exec.Command("choco", "install", "modsecurity") err = cmd.Run() if err != nil { fmt.Println("Error installing ModSecurity:", err) return } fmt.Println("Installation completed successfully.") } ``` 这个示例脚本使用 Chocolatey 管理器来安装软件。你可以根据需要修改命令,使用其他管理器或手动安装软件。 接下来,你可以使用 Go 的 `os` 将脚本打包为可执行文件。例如,对于 Windows 系统,你可以使用以下命令: ``` GOOS=windows go build -o installer.exe main.go ``` 这将创建一个名为 `installer.exe` 的可执行文件,可以在 Windows 系统上运行。 对于 Linux 系统,你可以使用以下命令将脚本打包tar 文件: ``` tar -cvzf installer.tar.gz main ``` 这将创建一个名为 `installer.tar.gz` 的 tar 文件,可以在 Linux 系统上解压和运行。 请注意,这只是一个简单的示例脚本,你需要根据自己的需要进行修改和定制。此外,确保你有权限安装软件和修改系统配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值