2017-08-08 10 views
1

によって最新のファイルを見つけることが、最終的に私は、ディレクトリ内のファイルの最新の更新日時を検索し、ファイル名を返すようにしたいと思います。これまでのコードは以下の通りです。誰かがこれよりも効率的な解決策で私を助けてくださいできますか?私は本当にこれがスーパーハッキーだと感じている。私は何をやっていると、日付を取得し、あなただけfi.ModTime().Unix()の出力を比較し、最も最近変更されたファイルを見つけるための最大値を保つことができGolangは、私はこれを正しくやっている場合、私はわからない日時

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

は、これは素晴らしい – ozfive

答えて

2

は細部や効率に注意してください。エラーをチェックしてください。あなたはファイルを尋ねたので、ディレクトリやその他のものをスキップします。同じタイムスタンプが変更された複数のファイルを許可します(たとえば、Windowsのファイル時間は最高で100ナノ秒です)。あなたは既にModTime()を持っていますので、os.Stat()を呼び出さないでください。 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) 
    } 
} 
+0

ポインタをありがとう、これらは私が取り組んでいるものすべてに非常に関連しています。 – ozfive

3

を削除しています。例えば

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

特定のウィンドウです!ありがとうございました!!! – ozfive

+0

これはLinux上で動作するかもしれませんが、ウィンドウ上に空白の出力が出るようです。私はお詫びします、私はこれがWindows特有であると言及するのを忘れました。 – ozfive

+1

'dir'の値を変更しますか?それがそこにある唯一の* nix固有のコードです。 –

関連する問題