Golang按日期和时间查找最近的文件

Golang按日期和时间查找最近的文件,go,time,comparison,Go,Time,Comparison,我不确定这样做是否正确,但最终我希望在目录中找到文件的最新修改日期并返回文件名。到目前为止,我掌握的代码如下。有人能帮我找到一个比这更有效的解决方案吗。我真的有一种感觉,这是超级黑客。我正在做的是获取日期并删除 package main import ( "fmt" "io/ioutil" "os" "strconv" "strings" ) func main() { dir := "C:\\temp\\" files, _ := i

我不确定这样做是否正确,但最终我希望在目录中找到文件的最新修改日期并返回文件名。到目前为止,我掌握的代码如下。有人能帮我找到一个比这更有效的解决方案吗。我真的有一种感觉,这是超级黑客。我正在做的是获取日期并删除

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strconv"
    "strings"
)

func main() {
    dir := "C:\\temp\\"
    files, _ := ioutil.ReadDir(dir)
    for _, f := range files {
        fi, _ := os.Stat(dir + f.Name())
        s := strings.Split(fi.ModTime().Format("2006-01-02 15.04.05.000"), " ")

        fdate, err := strconv.Atoi(strings.Replace(s[0], "-", "", -1))
        if err != nil {
            fmt.Println(err)
        }

        ftime, err := strconv.Atoi(strings.Replace(s[1], ".", "", -1))
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(fi.Name(), fdate+ftime)
    }

}

您只需比较fi.ModTime().Unix()的输出,并保留最大值即可找到最近修改的文件

例如:

package main

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    dir := "/tmp/"
    files, _ := ioutil.ReadDir(dir)
    var newestFile string
    var newestTime int64 = 0
    for _, f := range files {
        fi, err := os.Stat(dir + f.Name())
        if err != nil {
            fmt.Println(err)
        }
        currTime := fi.ModTime().Unix()
        if currTime > newestTime {
            newestTime = currTime
            newestFile = f.Name()
        }
    }
    fmt.Println(newestFile)
}

注重细节和效率。检查错误。你要求文件,所以跳过目录和其他东西。允许多个具有相同修改时间戳的文件(例如,Windows文件时间的分辨率最多为100纳秒)。您已经有ModTime(),所以不要调用os.Stat()。直接使用time.time方法。等等

比如说,

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "time"
)

func main() {
    dir := `C:\temp\` // Windows directory
    files, err := ioutil.ReadDir(dir)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    var modTime time.Time
    var names []string
    for _, fi := range files {
        if fi.Mode().IsRegular() {
            if !fi.ModTime().Before(modTime) {
                if fi.ModTime().After(modTime) {
                    modTime = fi.ModTime()
                    names = names[:0]
                }
                names = append(names, fi.Name())
            }
        }
    }
    if len(names) > 0 {
        fmt.Println(modTime, names)
    }
}

这似乎可以在Linux上运行,但在windows上输出为空白。很抱歉,我忘记提及这是Windows特有的。是否更改
dir
的值?这是那里唯一的*nix特定代码。这是我试用你的代码时做的第一件事。这是windows特定代码。谢谢你提供的提示,这些都与我的工作非常相关。