diff --git a/aufs/aufs b/aufs/aufs index 2df4c27..b1a6d76 100644 Binary files a/aufs/aufs and b/aufs/aufs differ diff --git a/scalib/util/fsutil.go b/scalib/util/fsutil.go new file mode 100644 index 0000000..6c4a975 --- /dev/null +++ b/scalib/util/fsutil.go @@ -0,0 +1,192 @@ +package util + +import ( + "archive/zip" + "crypto/sha256" + "encoding/base64" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strings" +) + +// base64 encode +// url safe +func Bas64end(str string) string { + // bdata:= + return base64.URLEncoding.EncodeToString([]byte(str)) +} + +// base64 url safe uneconde +func Base64dec(bsstr string) string { + dedc, _ := base64.URLEncoding.DecodeString(bsstr) + return string(dedc) +} + +// 计算文件的hash +func CalacHash(rfile string) string { + // 获取到真实地址 + // + file, err := os.Open(rfile) + if err != nil { + panic(err) + } + defer file.Close() + + // initlize hash object + hash := sha256.New() + + // write file into hash object + if _, err := io.Copy(hash, file); err != nil { + panic(err) + } + // get hash value + hashBytes := hash.Sum(nil) + //converto to hash string + hastString := fmt.Sprintf("%x", hashBytes) + return hastString +} + +// 判断文件是否存在 +func IsFileExist(filename string) bool { + if _, err := os.Stat(filename); err == nil { + return true + } + return false +} + +// 解压缩zip文件 +// 这个方法必须是首字母大写的,才能被注册 +// src: 需要解压的zip文件 +// curPath: 解压到的路径 +func DecompressZip(zpFname string, curPath string) error { + // 下载文件 + archive, err := zip.OpenReader(zpFname) + if err != nil { + return err + } + // 取zip文件的绝对路径的文件夹。会默认解压到files下,暂停使用 + // dir := filepath.Dir(zpFname) + defer archive.Close() + // 遍历目录 + for _, f := range archive.File { + // zip 解压的时候,路径为监听的路径 + filePath := filepath.Join(curPath, f.Name) + // 暂停原因 屏蔽解压到files 目录下 + //filePath := filepath.Join(dir, f.Name) + if f.FileInfo().IsDir() { + os.MkdirAll(filePath, os.ModePerm) + continue + } + // 父文件夹开始创建目录 + if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil { + return fmt.Errorf("failed to make directory (%v)", err) + } + // 文件原有模式 + dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) + if err != nil { + return fmt.Errorf("failed to create file (%v)", err) + } + fileInArchive, err := f.Open() + if err != nil { + return fmt.Errorf("failed to open file in zip (%v)", err) + } + if _, err := io.Copy(dstFile, fileInArchive); err != nil { + return fmt.Errorf("failed to copy file in zip (%v)", err) + } + dstFile.Close() + fileInArchive.Close() + } + return nil +} + +// dest:目的地址以及压缩文件名 eg:/data/logZip/2022-12-12-log.zip +// paths:需要压缩的所有文件所组成的集合 +func CompressToZip(dest string, currentPath string, paths []string) error { + // fmt.Printf("currentPath:%s\n", currentPath) + // fmt.Printf("paths len:%d\n", len(paths)) + // fmt.Println("real path", currentPath) + // 打开files 目录 + filesPath := "" + if dir, err := os.Getwd(); err == nil { + filesPath = dir + "/sync_zips/" + } + if err := os.MkdirAll(filesPath, os.ModePerm); err != nil { + fmt.Println(err.Error()) + } + // ToSlash 过滤windows的斜杠引起的bug + zfile, err := os.Create(path.Join("./sync_zips", "/", dest)) + if err != nil { + return err + } + defer zfile.Close() + zipWriter := zip.NewWriter(zfile) + defer zipWriter.Close() + + // 遍历带压缩的目录信息 + for _, src := range paths { + // 替换文件名,并且去除前后 "\" 或 "/" + // path = strings.Trim(path, string(filepath.Separator)) + // 从配置中读取到源目录 + src = path.Join(currentPath, "/", src) + // 删除尾随路径(如果它是目录) + src = strings.TrimSuffix(src, string(os.PathSeparator)) + // fmt.Printf("zip src:%s\n", src) + // 文件遍历 + err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error { + // fmt.Printf("zip path:%s\n", path) + if err != nil { + return err + } + // 创建本地文件头 + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + + // 监听的工作目录作为文件的结尾,然后取相对路径 + // 在zip存档中设置文件的相对路径 + // 将压缩包中的绝对路径替换为相对路径 + header.Name, err = filepath.Rel(filepath.Dir(src), path) + if err != nil { + return err + } + + // 转换为Unix风格的路径分隔符 + header.Name = filepath.ToSlash(header.Name) + + // 目录需要拼上一个 "/" ,否则会出现一个和目录一样的文件在压缩包中 + if info.IsDir() { + header.Name += "/" + } else { + // 将压缩方法设置为deflate + header.Method = zip.Deflate + } + // fmt.Printf("zip header:%v\n", header.Name) + // 创建写入头的writer + headerWriter, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + if info.IsDir() { + return nil + } + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + _, err = io.Copy(headerWriter, f) + return err + }) + + if err != nil { + return err + } + } + // 存到指定位置 + os.Rename(dest, path.Join("./sync_zips/", dest)) + return nil +}