From 461e4d6e1717fdba74a6b3574a2037cdce4821ac Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Mon, 18 Mar 2024 10:57:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=20=E6=96=87=E4=BB=B6=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ejson=E5=92=8Czip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/framework/utils/file/json.go | 108 ++++++++++++++++++++++++++++++ src/framework/utils/file/zip.go | 111 +++++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/framework/utils/file/json.go create mode 100644 src/framework/utils/file/zip.go diff --git a/src/framework/utils/file/json.go b/src/framework/utils/file/json.go new file mode 100644 index 0000000..e35a7c0 --- /dev/null +++ b/src/framework/utils/file/json.go @@ -0,0 +1,108 @@ +package file + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "nms_nbi/src/framework/logger" +) + +// WriterFileJSON 写入JSON文件 +func WriterFileJSON(data any, filePath string) error { + // 获取文件所在的目录路径 + dirPath := filepath.Dir(filePath) + + // 确保文件夹路径存在 + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + logger.Errorf("CreateFile MkdirAll %v", err) + } + + // 创建或打开文件 + file, err := os.Create(filePath) + if err != nil { + return err + } + defer file.Close() + + // 创建 JSON 编码器 + encoder := json.NewEncoder(file) + + // 将数据编码并写入文件 + err = encoder.Encode(data) + if err != nil { + return err + } + + return nil +} + +// WriterFileJSONLine 写入JSON文件用 一行一个JSON +func WriterFileJSONLine(data []any, filePath string) error { + // 获取文件所在的目录路径 + dirPath := filepath.Dir(filePath) + + // 确保文件夹路径存在 + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + logger.Errorf("CreateFile MkdirAll %v", err) + } + + // 创建或打开文件 + file, err := os.Create(filePath) + if err != nil { + return err + } + defer file.Close() + + // 创建一个 Writer 对象,用于将数据写入文件 + writer := bufio.NewWriter(file) + for _, row := range data { + jsonData, err := json.Marshal(row) + if err != nil { + return err + } + + // 写入 JSON 字符串到文件,并换行 + fmt.Fprintln(writer, string(jsonData)) + } + + // 将缓冲区中的数据刷新到文件中 + err = writer.Flush() + if err != nil { + logger.Errorf("CreateFile Flush %v", err) + return err + } + return nil +} + +// ReadFileJSONLine 读取行JSON文件 一行一个JSON +func ReadFileJSONLine(filePath string) []string { + // 创建 map 存储数据 + arr := make([]string, 0) + + // 打开文本文件 + file, err := os.Open(filePath) + if err != nil { + logger.Errorf("OpenFile Open %v", err) + return arr + } + defer file.Close() + + // 创建一个 Scanner 对象,用于逐行读取文件内容 + scanner := bufio.NewScanner(file) + if scanner.Err() != nil { + logger.Errorf("OpenFile NewScanner %v", scanner.Err()) + return arr + } + + for scanner.Scan() { + line := scanner.Text() + arr = append(arr, line) + } + + return arr +} diff --git a/src/framework/utils/file/zip.go b/src/framework/utils/file/zip.go new file mode 100644 index 0000000..e2d8f7a --- /dev/null +++ b/src/framework/utils/file/zip.go @@ -0,0 +1,111 @@ +package file + +import ( + "archive/zip" + "fmt" + "io" + "os" + "path/filepath" +) + +// CompressZipByFile 将单文件添加到 ZIP 压缩文件 +func CompressZipByFile(zipFilePath, filePath string) error { + // 创建一个新的 ZIP 文件 + newZipFile, err := os.Create(zipFilePath) + if err != nil { + return fmt.Errorf("创建 ZIP 文件失败: %w", err) + } + defer newZipFile.Close() + + // 创建 ZIP 写入器 + zipWriter := zip.NewWriter(newZipFile) + defer zipWriter.Close() + + fileToCompress, err := os.Open(filePath) + if err != nil { + return fmt.Errorf("打开文件失败: %w", err) + } + defer fileToCompress.Close() + + // 获取文件信息 + fileInfo, err := fileToCompress.Stat() + if err != nil { + return fmt.Errorf("获取文件信息失败: %w", err) + } + + // 创建文件头 + header, err := zip.FileInfoHeader(fileInfo) + if err != nil { + return fmt.Errorf("创建文件头失败: %w", err) + } + + // 设置文件头中的名称 + header.Name = fileInfo.Name() + + // 创建文件在 ZIP 中的写入器 + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return fmt.Errorf("创建文件写入器失败: %w", err) + } + + // 将文件内容复制到 ZIP 文件中 + _, err = io.Copy(writer, fileToCompress) + if err != nil { + return fmt.Errorf("将文件内容复制到 ZIP 失败: %w", err) + } + + return nil +} + +// CompressZipByDir 将目录下文件添加到 ZIP 压缩文件 +func CompressZipByDir(zipFilePath, dirPath string) error { + // 创建输出文件 + zipWriter, err := os.Create(zipFilePath) + if err != nil { + return err + } + defer zipWriter.Close() + + // 创建 zip.Writer + zipWriterObj := zip.NewWriter(zipWriter) + defer zipWriterObj.Close() + + // 遍历目录下的所有文件和子目录 + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // 忽略目录 + if info.IsDir() { + return nil + } + + // 创建文件条目 + relativePath, err := filepath.Rel(dirPath, path) + if err != nil { + return err + } + fileEntry, err := zipWriterObj.Create(relativePath) + if err != nil { + return err + } + + // 打开文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + // 写入文件内容到 ZIP 文件 + _, err = io.Copy(fileEntry, file) + if err != nil { + return err + } + + return nil + }) + + return err +}