You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang如何查找指定文件夹中指定日期范围内创建的文件

在指定文件夹中按创建时间范围查找文件

你当前的代码有两个核心问题:

  1. 使用i.ModTime()获取的是文件修改时间,而非创建时间
  2. 仅实现了"晚于单个时间点"的筛选,未处理时间范围的需求

核心难点:创建时间的跨平台获取

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:15:34