Golang如何从文件夹中获取最新文件

Golang如何从文件夹中获取最新文件 我需要从子文件夹中获取最新的文件。我使用了 os.ReadDir

它非常快,但它没有给我完整的文件路径…

如何实现这一点。

func main() {
    fmt.Println("hello world")
}
4 回复

谢谢。

我尝试过 filepath.Walk,与 readdir 相比它速度较慢。

我会再检查一下。

更多关于Golang如何从文件夹中获取最新文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 filepath 包,例如:

import (
    "fmt"
    "os"
    "path/filepath"
)

files, _ = os.ReadDir(dir)
path, _ := filepath.Abs(dir)
for _, file := range files {
    fmt.Println(filepath.Join(path, file.Name())
}

我需要获取子文件夹中最新的文件。我使用了 os.readdir,它速度很快,但没有给我完整的文件路径……该如何实现?

试试这个:

type FileInfo struct {
    os.FileInfo
    FullPath string
}

func GetLatestFileInDir(dir string) (*FileInfo, error) {
	var files []FileInfo

	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() {
			files = append(files, FileInfo{FileInfo: info, FullPath: path})
		}
		return nil
	})
	if err != nil {
		return nil, err
	}

	if len(files) == 0 {
		return nil, fmt.Errorf("no files found in directory %s", dir)
	}

	// 按修改时间对文件进行排序
	sort.Slice(files, func(i, j int) bool {
		return files[i].ModTime().After(files[j].ModTime())
	})

	// 返回最新的文件
	return &files[0], nil
}

你可以使用 os.ReadDir 读取目录,然后通过 os.Stat 获取文件信息并比较修改时间。以下是示例代码:

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"time"
)

func getLatestFile(dir string) (string, error) {
	var latestFile string
	var latestTime time.Time

	entries, err := os.ReadDir(dir)
	if err != nil {
		return "", err
	}

	for _, entry := range entries {
		if entry.IsDir() {
			continue
		}

		info, err := entry.Info()
		if err != nil {
			continue
		}

		fullPath := filepath.Join(dir, entry.Name())
		if info.ModTime().After(latestTime) {
			latestTime = info.ModTime()
			latestFile = fullPath
		}
	}

	return latestFile, nil
}

func main() {
	dir := "./your/subfolder"
	latest, err := getLatestFile(dir)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Latest file:", latest)
}

如果需要递归搜索子文件夹:

func getLatestFileRecursive(dir string) (string, error) {
	var latestFile string
	var latestTime time.Time

	err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() && info.ModTime().After(latestTime) {
			latestTime = info.ModTime()
			latestFile = path
		}
		return nil
	})

	return latestFile, err
}
回到顶部