目录操作
读取目录下文件
Go
func dirOperation() {
dirEntry, err := os.ReadDir(".")
if err != nil {
fmt.Println("dirEntry err", err)
return
}
for _, entry := range dirEntry {
fmt.Println(entry.IsDir(), entry.Name())
fileInfo, _ := entry.Info()
fmt.Println(fileInfo.Size())
}
}
func main() {
dirOperation()
}
一次性获取目标路径下所有的文件
- 使用
filePath.WalkDir
会自动递归遍历
文件夹下的所有文件并返回
Go
package main
import (
"fmt"
"io/fs"
"path/filepath"
"regexp"
)
var (
ignoreFileNameReg = regexp.MustCompile(`(\.DS_Store)`) // 忽略的文件名称正则
)
func traversalDir(dirPath string) []string {
allFiles := make([]string, 0)
filepath.WalkDir(dirPath, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fileInfo, fileInfoErr := d.Info() // 获取文件的信息
if fileInfoErr != nil { // 获取文件信息失败
return fileInfoErr
}
fileName := fileInfo.Name() // 获取文件名称
matchResult := ignoreFileNameReg.FindAllSubmatchIndex([]byte(fileName), -1) // 正则匹配文件名称是否为.DS_Store,并返回匹配的索引
// 判断当前path是一个文件,并且文件名称不为 .DS_Store
if fileInfo.Mode().IsRegular() && len(matchResult) == 0 {
allFiles = append(allFiles, path)
}
return nil
})
return allFiles
}
func main() {
dirPath := "/Users/xxxx/xxxx"
allFiles := traversalDir(dirPath)
fmt.Println("allFiles", allFiles)
}
- 模拟并发处理文件操作,考虑了协程安全
Go
package main
import (
"fmt"
"io/fs"
"path/filepath"
"regexp"
"sync"
)
var (
ignoreFileNameReg = regexp.MustCompile(`(\.DS_Store)`) // 忽略的文件名称正则
count int
mLock sync.Mutex
)
func traversalDir(dirPath string) []string {
allFiles := make([]string, 0)
filepath.WalkDir(dirPath, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
fileInfo, fileInfoErr := d.Info()
if fileInfoErr != nil {
return fileInfoErr
}
fileName := fileInfo.Name()
matchResult := ignoreFileNameReg.FindAllSubmatchIndex([]byte(fileName), -1)
// 判断当前path是一个文件,并且文件名称不为 .DS_Store
if fileInfo.Mode().IsRegular() && len(matchResult) == 0 {
// fmt.Println(path, "是文件", fileName, ignoreFileNameReg.FindAllSubmatchIndex([]byte(fileName), -1))
allFiles = append(allFiles, path)
}
return nil
})
return allFiles
}
func processFile(file string) {
// fmt.Println(file, "file")
mLock.Lock()
defer mLock.Unlock()
count += 1
}
func main() {
dirPath := "/dirPath"
allFiles := traversalDir(dirPath)
filesCount := len(allFiles)
if filesCount == 0 {
return
}
fmt.Println("filesCount", filesCount)
var wg sync.WaitGroup
wg.Add(filesCount)
for _, file := range allFiles {
go func(curFile string) {
defer wg.Done()
processFile(curFile)
}(file)
}
wg.Wait()
fmt.Println("<<<count>>>", count)
}