Golang如何查找指定文件夹中指定日期范围内创建的文件
在指定文件夹中按创建时间范围查找文件
你当前的代码有两个核心问题:
- 使用
i.ModTime()获取的是文件修改时间,而非创建时间 - 仅实现了"晚于单个时间点"的筛选,未处理时间范围的需求
核心难点:创建时间的跨平台获取
Go标准库的os.FileInfo没有提供跨平台的创建时间接口,必须依赖平台相关的系统调用。我们可以通过golang.org/x/sys下的对应包实现:
- 类Unix系统(Linux、macOS):
golang.org/x/sys/unix - Windows系统:
golang.org/x/sys/windows
完整实现代码
以下是支持跨平台、按创建时间范围筛选的代码:
package main import ( "fmt" "os" "path/filepath" "time" "golang.org/x/sys/unix" // Windows系统替换为 "golang.org/x/sys/windows" ) func main() { targetDir := "path/to/folderX" // 定义时间范围:2013年8月1日0点到8月31日23:59:59 start, err := time.Parse("2006-01-02", "2013-08-01") if err != nil { panic(fmt.Errorf("解析起始时间失败:%w", err)) } end, err := time.Parse("2006-01-02 15:04:05", "2013-08-31 23:59:59") if err != nil { panic(fmt.Errorf("解析结束时间失败:%w", err)) } files, fileInfos, err := findFilesInCreationRange(targetDir, start, end) if err != nil { panic(fmt.Errorf("遍历目录失败:%w", err)) } for i, path := range files { ctime, _ := getCreationTime(fileInfos[i]) fmt.Printf("符合条件:%s | 创建时间:%s\n", path, ctime.Format("2006-01-02 15:04:05")) } } // findFilesInCreationRange 遍历目录,返回创建时间在[start, end]之间的文件路径和信息 func findFilesInCreationRange(dir string, start, end time.Time) ([]string, []os.FileInfo, error) { var paths []string var infos []os.FileInfo err := filepath.Walk(dir, func(path string, info os.FileInfo, walkErr error) error { if walkErr != nil { return walkErr } if info.IsDir() { return nil // 跳过目录 } ctime, err := getCreationTime(info) if err != nil { fmt.Printf("跳过文件%s:无法获取创建时间 - %v\n", path, err) return nil } // 判断是否在时间范围内(包含边界) if (ctime.Equal(start) || ctime.After(start)) && (ctime.Equal(end) || ctime.Before(end)) { paths = append(paths, path) infos = append(infos, info) } return nil }) return paths, infos, err } // getCreationTime 按平台获取文件创建时间 func getCreationTime(info os.FileInfo) (time.Time, error) { // 类Unix系统实现(Linux/macOS) stat, ok := info.Sys().(*unix.Stat_t) if !ok { return time.Time{}, fmt.Errorf("无法转换为Unix Stat_t") } return time.Unix(int64(stat.Birthtim.Sec), int64(stat.Birthtim.Nsec)), nil // Windows系统请替换为以下代码: // stat, ok := info.Sys().(*windows.Win32FileAttributeData) // if !ok { // return time.Time{}, fmt.Errorf("无法转换为Windows Win32FileAttributeData") // } // return time.Unix(0, stat.CreationTime.Nanoseconds()), nil }
关键说明
- 时间范围边界:将结束时间设为
2013-08-31 23:59:59,确保包含当天所有时间创建的文件 - 跨平台适配:根据系统切换
sys包,注意不同平台的文件状态结构体差异 - 容错处理:遇到无法获取创建时间的文件时,跳过该文件继续遍历,避免整个流程中断
- 如果只需要修改时间范围:可以去掉
getCreationTime相关逻辑,直接用info.ModTime()替换,判断逻辑不变
内容的提问来源于stack exchange,提问作者Mjeduar
相关产品推荐
相关产品推荐

