1 Star 0 Fork 0

qingbing / go-utils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
file.go 2.44 KB
一键复制 编辑 原始数据 按行查看 历史
qingbing 提交于 2024-05-02 22:45 . 结构调整
package file
import (
"io"
"io/fs"
"os"
"path"
"strings"
"gitee.com/duqingbing/go-utils/basic"
)
/*
* 获取目录下的文件列表
* dir: 扫描目录
* ignores : 忽略文件或文件夹
* recursion : 是否递归查找
*/
func FileList(dir string, ignores basic.KSlice, recursion bool) (res []string, err error) {
dir = strings.TrimRight(dir, "/")
fs, err := os.ReadDir(dir)
if err != nil {
return
}
m := ignores.ToMap()
for _, f := range fs {
fullName := path.Join(dir, f.Name())
if _, ok := m[fullName]; ok { // 出现在过滤中
continue
}
if f.IsDir() {
if recursion {
var subRes []string
subRes, err = FileList(fullName, ignores, true)
if err != nil {
return
}
res = append(res, subRes...)
}
continue
}
res = append(res, fullName)
}
return
}
/*
* 复制文件
* src: 复制源文件
* dist: 目标文件
* ignores : 忽略文件或文件夹
*/
func CopyFile(src, dist string) (copySize int, err error) {
// 打开源文件
sFile, err := os.Open(src)
if err != nil {
return
}
defer sFile.Close()
// 打开写入文件
dFile, err := os.Create(dist)
if err != nil {
return
}
defer dFile.Close()
// 创建缓冲区,边读边写
buf := make([]byte, 4096) // 由于虚拟内存的最小单位是 page(默认是4096),所以,设置成 4096
readSize := 0
for {
readSize, err = sFile.Read(buf)
if err != nil && err != io.EOF { // 读取错误
return
}
if readSize == 0 { // 读完毕
err = nil
return
}
copySize += readSize
// 写入文件
dFile.Write(buf[:readSize])
}
}
/*
* 复制目录
* src: 复制源目录
* dist: 目标目录
* ignores : 忽略文件或文件夹
*/
func CopyDir(src, dist string, ignores basic.KSlice) error {
ds, err := fs.ReadDir(os.DirFS(src), ".")
if err != nil {
return err
}
// 确保目标目录存在
if info, err := os.Stat(dist); err != nil || (info != nil && !info.IsDir()) {
if err = os.Mkdir(dist, os.ModePerm); err != nil {
return err
}
}
m := ignores.ToMap()
for _, file := range ds {
filename := file.Name()
if _, ok := m[filename]; ok { // 出现在过滤中
continue
}
srcFile := path.Join(src, file.Name())
distFile := path.Join(dist, file.Name())
if file.IsDir() {
if err = CopyDir(srcFile, distFile, ignores); err != nil {
return err
}
} else if _, err = CopyFile(path.Join(src, file.Name()), path.Join(dist, file.Name())); err != nil {
return err
}
}
return nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/duqingbing/go-utils.git
git@gitee.com:duqingbing/go-utils.git
duqingbing
go-utils
go-utils
3f5828c3b20c

搜索帮助

344bd9b3 5694891 D2dac590 5694891