mirror of
https://gitee.com/samwaf/SamWaf.git
synced 2026-10-31 10:11:42 +08:00
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
// ReadFileConcurrently 读取单个文件的内容,并返回文件内容或错误
|
|
func ReadFileConcurrently(filePath string, wg *sync.WaitGroup, resultChan chan<- string, errChan chan<- error) {
|
|
defer wg.Done() // 完成时减少 wait group 计数
|
|
|
|
// 检查文件是否存在
|
|
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
|
errChan <- fmt.Errorf("file does not exist: %s", filePath)
|
|
return
|
|
}
|
|
|
|
// 读取文件内容
|
|
content, err := ioutil.ReadFile(filePath)
|
|
if err != nil {
|
|
errChan <- fmt.Errorf("error reading file %s: %v", filePath, err)
|
|
return
|
|
}
|
|
|
|
// 返回文件内容
|
|
resultChan <- string(content)
|
|
}
|
|
|
|
// ReadFile 读取指定文件的内容并返回结果或错误
|
|
func ReadFile(filePath string) (string, error) {
|
|
var wg sync.WaitGroup
|
|
|
|
// 创建用于返回结果和错误的通道
|
|
resultChan := make(chan string, 1)
|
|
errChan := make(chan error, 1)
|
|
|
|
// 并发读取文件
|
|
wg.Add(1)
|
|
go ReadFileConcurrently(filePath, &wg, resultChan, errChan)
|
|
|
|
// 等待文件读取完成
|
|
wg.Wait()
|
|
|
|
// 读取结果,避免在关闭通道后访问
|
|
var result string
|
|
var err error
|
|
select {
|
|
case result = <-resultChan:
|
|
// 成功读取内容
|
|
case err = <-errChan:
|
|
// 读取出错
|
|
}
|
|
|
|
// 关闭通道
|
|
close(resultChan)
|
|
close(errChan)
|
|
|
|
// 返回结果或错误
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return result, nil
|
|
}
|