Golang ioutil.ReadDir 讀取目錄下的內容並排序


之前寫的https://www.cnblogs.com/pu369/p/10620731.html一文中,也有對slice的排序,但代碼亂的自己也看不下去了。

參考https://blog.csdn.net/zhangyexinaisurui/article/details/82688618准備讀目錄,並按時間排序

一、與參考內容一樣,直接讀目錄,默認是按名字排序

package main

import (
    "fmt"
    "io/ioutil"
)

func listAll(path string, curHier int) {
    readerInfos, err := ioutil.ReadDir(path)
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, info := range readerInfos {
        if info.IsDir() {
            for tmpheir := curHier; tmpheir > 0; tmpheir-- {
                fmt.Printf("|\t")
            }
            fmt.Println(info.Name(), "\\")
            listAll(path+"\\"+info.Name(), curHier+1)
        } else {
            for tmpheir := curHier; tmpheir > 0; tmpheir-- {
                fmt.Printf("|\t")
            }
            fmt.Println(info.Name(), " ", info.ModTime())
        }
    }
}
func main() {
    //    dir := os.Args[1]
    dir := "I:/img"
    listAll(dir, 0)
}

二、改為按[]os.FileInfo的 info.ModTime()排序

package main

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

func listAll(path string, curHier int) {
    readerInfos, err := ioutil.ReadDir(path)
    if err != nil {
        fmt.Println(err)
        return
    }
    readerInfos1 := sortByTime(readerInfos)
    for _, info := range readerInfos1 {
        if info.IsDir() {
            for tmpheir := curHier; tmpheir > 0; tmpheir-- {
                fmt.Printf("|\t")
            }
            fmt.Println(info.Name(), "\\")
            listAll(path+"\\"+info.Name(), curHier+1)
        } else {
            for tmpheir := curHier; tmpheir > 0; tmpheir-- {
                fmt.Printf("|\t")
            }
            fmt.Println(info.Name(), " ", info.ModTime())
        }
    }
}
func main() {
    //    dir := os.Args[1]
    dir := "I:/img"
    listAll(dir, 0)
}
func sortByTime(pl []os.FileInfo) []os.FileInfo {
    sort.Slice(pl, func(i, j int) bool {
        flag := false
        if pl[i].ModTime().After(pl[j].ModTime()) {
            flag = true
        } else if pl[i].ModTime().Equal(pl[j].ModTime()) {
            if pl[i].Name() < pl[j].Name() {
                flag = true
            }
        }
        return flag
    })
    return pl
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM