package test

import (
	"archive/zip"
	"fmt"
	"io"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"testing"
)

func TestZip(t *testing.T) {
	//src := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)"
	//dest := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20).zip"
	//excludeDir := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)\\搜索引擎" // 你想排除的子目录
	//err := ZipDir(src, dest, excludeDir)
	//if err != nil {
	//	fmt.Println("Error:", err)
	//	return
	//}
	//fmt.Println("Zip created successfully:", dest)
	ZipDir2("/root/pjirobot/data/", "/root/pjirobot/data.zip", []string{"config", "map", "mapBuf"})
}

// 压缩指定目录到ZIP文件,并排除一个指定的子目录
func ZipDir(src, dest, excludeDir string) error {
	zipf, err := os.Create(dest)
	if err != nil {
		return err
	}
	defer zipf.Close()

	archive := zip.NewWriter(zipf)
	defer archive.Close()

	filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		header, err := zip.FileInfoHeader(info)
		if err != nil {
			return err
		}

		// 修正文件路径,使其相对于src
		header.Name, err = filepath.Rel(src, path)
		if err != nil {
			return err
		}

		// 如果路径包含要排除的目录,则跳过
		if strings.Contains(header.Name, excludeDir) {
			if info.IsDir() {
				return filepath.SkipDir // 如果是目录,则跳过整个目录
			}
			return nil // 如果是文件,则忽略该文件
		}

		if info.IsDir() {
			header.Name += "/"
		} else {
			header.Method = zip.Deflate
		}

		writer, err := archive.CreateHeader(header)
		if err != nil {
			return err
		}

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

	return nil
}
func ZipDir2(src string, dest string, dirs []string) {
	// 创建 zip 命令参数
	args := []string{"-r", dest}
	for _, dir := range dirs {
		args = append(args, filepath.Join(src, dir))
	}

	// 创建 zip 命令
	cmd := exec.Command("zip", args...)

	// 设置工作目录
	cmd.Dir = src

	// 执行 zip 命令并获取输出
	fmt.Println(args)
}