Skip to content
On this page

目录操作

读取目录下文件

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)
}