fix: 文件操作新增json和zip
This commit is contained in:
108
src/framework/utils/file/json.go
Normal file
108
src/framework/utils/file/json.go
Normal file
@@ -0,0 +1,108 @@
|
||||
package file
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"be.ems/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
|
||||
}
|
||||
111
src/framework/utils/file/zip.go
Normal file
111
src/framework/utils/file/zip.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user