2017-08-08 3 views
1

Je ne suis pas sûr si je le fais correctement, mais finalement je voudrais trouver la date de modification la plus récente d'un fichier dans un répertoire et renvoyer le nom du fichier. Le code que j'ai jusqu'à présent est le suivant. Quelqu'un peut-il m'aider s'il vous plaît avec une solution plus efficace que cela. J'ai vraiment le sentiment que c'est super hacky. Ce que je fais est d'obtenir les dates et le retrait duGolang trouver le fichier le plus récent par date et heure

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

} 
+0

C'est – ozfive

Répondre

2

attention aux détails et l'efficacité. Vérifiez les erreurs. Vous avez demandé des fichiers afin d'ignorer les répertoires et d'autres choses. Autoriser plusieurs fichiers avec le même horodatage modifié (par exemple, les durées de fichier Windows ont une résolution de 100 nanosecondes au mieux). Vous avez déjà ModTime() alors n'appelez pas os.Stat(). Utilisez time.Time méthodes directement. Etc.

Par exemple,

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

Merci pour les pointeurs, ils sont tous très pertinents pour ce sur quoi je travaille. – ozfive

3

Vous pouvez les comparer les sorties de fi.ModTime().Unix() et de garder la plus grande valeur pour trouver le fichier le plus récemment modifié.

Par exemple:

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

fenêtres spécifiques Impressionnant! Je vous remercie!!! – ozfive

+0

Il semble que cela fonctionne sur Linux mais crache une sortie vide sur Windows. Je m'excuse, j'ai oublié de mentionner que c'est Windows spécifique. – ozfive

+1

Modifier la valeur de 'dir'? C'est le seul code spécifique à * nix. –