Go 操作文件 遍歷目錄獲取文件列表


通過go遍歷目錄獲取文件列表

本文將會列舉三種方法

by Using:

filepath.Walk
ioutil.ReadDir
os.File.Readdir

 

使用filepath.Walk

path/filepath 標准庫的包提供了便捷的Walk方法,它能自動的掃描子目錄,使用起來也很簡單

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var files []string

    root := "/some/folder/to/scan"
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        files = append(files, path)
        return nil
    })
    if err != nil {
        panic(err)
    }
    for _, file := range files {
        fmt.Println(file)
    }
}

 

 

使用ioutil.ReadDir

filepath.Walk是很方便但是它會掃描所有子文件夾,缺省情況下,但這有時候不是我們想要的需求

go的標准庫還提供了ioutil.ReadDir

ioutil.ReadDir需要一個string類型的文件夾路徑然后返回一個os.FileInfo的切片,在上文中提到過。


package main

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

func main() {
    files, err := ioutil.ReadDir(".")
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        fmt.Println(file.Name())
    }
}

 

使用os.File.Readdir

ReadDir內部的實現方式

// ReadDir reads the directory named by dirname and returns
// a list of directory entries sorted by filename.
func ReadDir(dirname string) ([]os.FileInfo, error) {
    f, err := os.Open(dirname)
    if err != nil {
        return nil, err
    }
    list, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return nil, err
    }
    sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
    return list, nil
}

 

 

我們可以看到它只掃描文件夾目錄,然后將文件通過名字排序。如果我們不需要這種排序我們可以這樣:

package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    dirname := "."

    f, err := os.Open(dirname)
    if err != nil {
        log.Fatal(err)
    }
    files, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        fmt.Println(file.Name())
    }
}

 

Go獲取當前項目絕對路徑

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    //獲取當前項目絕對路徑
    path, err2 := os.Executable()
    if err2 != nil {
        fmt.Println(err2)
    }
    dir := filepath.Dir(path)
    fmt.Println("111", path) // /Users/mac/repose/idphoto_server_lite/test/test3
    fmt.Println("2222", dir) // /Users/mac/repose/idphoto_server_lite/test
}

 

 

 

 

 

 

 
 

 


免責聲明!

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



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