2017-11-17 6 views
0

私はginフレームワークとファイルウォークを使用しているので、私はプレイできません。私が何をしたいかgolangの継続時間をフォーマットする方法

package main 

import (
    "fmt" 
    "os" 
    "path/filepath" 
    "time" 
    "regexp" 
    "github.com/gin-gonic/gin" 
    "sort" 
    "strings" 
    "github.com/davidscholberg/go-durationfmt" 
) 

var filext = regexp.MustCompile(`\.[mM][pP]4|\.[mM]4[vV]|\.jpg|\.[hH]264|\.go`) 
var m map[int]string 
var keys []int 

func main() { 

    if gin.IsDebugging() { 
     fmt.Print("This progamm shows only the path and the age of a file in 'STARTDIR'\n") 
     fmt.Print("only the following files will be handled '.[mM][pP]4|.[mM]4[vV$|.[hH]264|.go'\n") 
     fmt.Print("The git repository: https://gitlab.com/aleks001/show-files-age \n") 
    } 

    if len(os.Getenv("LISTEN_IP_PORT")) == 0 { 
     fmt.Print("I need a ip and port on which I should listen.\n") 
     os.Exit(1) 
    } 
    router := gin.Default() 

    gin.DisableConsoleColor() 

    router.GET("/videoinfo",getInfo) 

    router.Run(os.Getenv("LISTEN_IP_PORT")) 
} 

func getInfo(c *gin.Context) { 

    loc, _ := time.LoadLocation("Europe/Vienna") 
    var startdir = "" 

    if os.Getenv("STARTDIR") != "" { 
     startdir = os.Getenv("STARTDIR") 
    } else if c.GetHeader("STARTDIR") != "" { 
     startdir = c.GetHeader("STARTDIR") 
    } else { 
     c.String(404,"Startdir not found <br>\n") 
     return 
    } 

    m = make(map[int]string) 
    keys = nil 

    filepath.Walk(startdir,walkpath) 

    for k := range m { 
     keys = append(keys, k) 
    } 
    sort.Ints(keys) 

    for _, k := range keys { 
     t := time.Date(time.Now().Year(),time.Now().Month(),time.Now().Day(),time.Now().Hour(),k,time.Now().Second(),time.Now().Nanosecond(),loc) 
     durStr, err := durationfmt.Format(time.Since(t), "%h:%m") 

     if err != nil { 
      fmt.Println(err) 
     } else { 
      //fmt.Println(durStr) 
      fmt.Printf("Key: %s Value: %s\n", durStr , m[k]) 
      c.String(200,"Minutes: %s File: %s\n", durStr, m[k]) 
     } 
    } 
} 

func walkpath(path string, f os.FileInfo, err error) error { 

    if err != nil { 
     fmt.Println(err) 
    } else { 
     if filext.MatchString(path) { 
      age := time.Now().Sub(f.ModTime()) 
      path_new := strings.Replace(path,"/videos/","",1) 
      // path_new := strings.Replace(path,"..\\","",1) 
      /* 
      fmt.Printf("Path: %s, ModTime: %s, Age: %s <br>\n", walker.Path(), walker.Stat().ModTime(), age) 
      c.String(200,"Path: %s, ModTime: %s, Age: %s <br>\n", walker.Path(), walker.Stat().ModTime(), age) 
      */ 
      fmt.Printf("Path: %s, Age: %d age minutes %0.2f <br>\n", path_new, age, age.Minutes()) 
      m[int(age.Minutes())]=path_new 
      //c.String(200,"Path: %s, Age: %0.2f <br>\n", path, age.Minutes()) 
     } 
    //fmt.Printf("%s with %d bytes at motime %s\n", path,f.Size(), f.ModTime()) 
} 
    return nil 
} 

filext ALSフィルタおよびソート基準としてMODTIMEに基づいてファイルのソートされた出力です。

私はリクエストの大部分を満たすことができましたが、以下に示すように出力が醜いように見えます。

私はhttps://github.com/davidscholberg/go-durationfmtを使用して継続時間をフォーマットしましたが、出力が醜いか、ライブラリが嫌です。

Minutes: 0:6 File: upload/dir003/file1.m4v 
Minutes: 0:5 File: transfer/dir5/file2.jpg 
Minutes: -5:-48 File: transfer/dir001/file.mp4 
Minutes: -6:-21 File: transfer/03.jpg 
Minutes: -6:-22 File: transfer/02.mp4 

私はこの問題を解決するためのより良い方法があると確信しています。 ありがとうございます。期間中、カスタムフォーマットを提供するために、例えば

+2

は、デフォルトの継続時間のフォーマットはあなたのために動作しませんか? – JimB

+0

いいえこれは6桁の小数を使っていますが、HH:SSのように見える2の出力しか必要ありません。 – Aleksandar

+0

あなたが望むものを正確に表示できますか? 'time.Duration'には、必要なときにフォーマットする数値を与えるための' Hours'、 'Minutes'、' Seconds'メソッドがあります。 – JimB

答えて

3

package main 

import (
    "fmt" 
    "time" 
) 

func fmtDuration(d time.Duration) string { 
    d = d.Round(time.Minute) 
    h := d/time.Hour 
    d -= h * time.Hour 
    m := d/time.Minute 
    return fmt.Sprintf("%02d:%02d", h, m) 
} 

func main() { 
    modTime := time.Now().Round(0).Add(-(3600 + 60 + 45) * time.Second) 
    since := time.Since(modTime) 
    fmt.Println(since) 
    durStr := fmtDuration(since) 
    fmt.Println(durStr) 
} 

遊び場:https://play.golang.org/p/HT4bFfoA5r

出力:

1h1m45s 
01:02 

あなたは時間にソートする場合Go sortパッケージを使用してください。私は、Since(ModTime)という計算時間を延期するために、ModTimeをソートし、それが印刷される時点で正確になるように並べ替えます。例えば、

package main 

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

func isVideo(path string) bool { 
    videos := []string{".mp4", ".m4v", ".h264"} 
    ext := strings.ToLower(filepath.Ext(path)) 
    for _, video := range videos { 
     if ext == video { 
      return true 
     } 
    } 
    return false 
} 

type modTimeInfo struct { 
    path string 
    modTime time.Time 
} 

func walkModTime(root string) ([]modTimeInfo, error) { 
    var infos []modTimeInfo 
    err := filepath.Walk(
     root, 
     func(path string, info os.FileInfo, err error) error { 
      if err != nil { 
       return err 
      } 
      if info.Mode().IsRegular() { 
       path = filepath.Clean(path) 
       if !isVideo(path) { 
        return nil 
       } 
       sep := string(filepath.Separator) 
       dir := sep + `Videos` + sep 
       path = strings.Replace(path, dir, sep, 1) 
       infos = append(infos, modTimeInfo{ 
        path: path, 
        modTime: info.ModTime()}, 
       ) 
      } 
      return nil 
     }, 
    ) 
    if err != nil { 
     return nil, err 
    } 
    return infos, nil 
} 

func sortModTime(infos []modTimeInfo) { 
    sort.SliceStable(
     infos, 
     func(i, j int) bool { 
      return infos[i].modTime.Before(infos[j].modTime) 
     }, 
    ) 
} 

func fmtAge(d time.Duration) string { 
    d = d.Round(time.Minute) 
    h := d/time.Hour 
    d -= h * time.Hour 
    m := d/time.Minute 
    return fmt.Sprintf("%02d:%02d", h, m) 
} 

func main() { 
    root := `/home/peter/Videos` // Testing ... 
    infos, err := walkModTime(root) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    sortModTime(infos) 
    now := time.Now() 
    for _, info := range infos { 
     age := fmtAge(now.Sub(info.modTime)) 
     fmt.Println("Age (H:M):", age, "File:", info.path) 
    } 
} 

遊び場:https://play.golang.org/p/j2TUmJdAi4

+0

ありがとうございます。それは持続時間の間働く。私はsort.Duration(k)関数を見つけませんでした。したがって、m [int(age.Minutes())] = path_new'のキーインデックスである 'var keys [] int ' 。私は 'sort.Ints(keys)'をソートするためにこれを使います。そこにはsort.Duration()関数がありますか? – Aleksandar

+0

@アレクサンドール:改訂版の回答を参照してください。 – peterSO

+0

あなたは私のヒーローです。お返事ありがとうございます – Aleksandar

関連する問題