Lista katalogów w Go

Próbowałem dowiedzieć się, jak po prostu wyświetlić listę plików i folderów w jednym katalogu w Go.

Znalazłem filepath.Walk, ale to idzie do podkatalogów automatycznie, czego nie chcę. Wszystkie moje poszukiwania nie wykazały niczego lepszego.

Jestem pewien, że ta funkcjonalność istnieje, ale naprawdę trudno ją znaleźć. Daj znać, jeśli ktoś wie, gdzie mam szukać. Dzięki.

 100
go
Author: Behram Mistree, 2013-02-03

4 answers

Możesz spróbować użyć funkcji ReadDir w pakiecie io/ioutil. Na docs:

ReadDir odczytuje katalog nazwany przez dirname i zwraca listę posortowanych wpisów katalogu.

Wynikowy wycinek zawiera typy os.FileInfo, które dostarczają metod wymienionych tutaj . Oto podstawowy przykład, który wyświetla nazwę wszystkiego w bieżącym katalogu (foldery są dołączone, ale nie są specjalnie oznaczone - możesz sprawdzić, czy Element jest folderem za pomocą IsDir() metoda):

package main

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

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

    for _, f := range files {
            fmt.Println(f.Name())
    }
}
 216
Author: RocketDonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 02:38:01

Jeszcze prostsze, użyj path/filepath:

package main    

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

func main() {
    files, err := filepath.Glob("*")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(files) // contains a list of all files in the current directory
}
 49
Author: Fatih Arslan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-07 13:32:39

Możemy uzyskać listę plików wewnątrz folderu w systemie plików za pomocą różnych funkcji biblioteki standardowej golang.

  1. filepath.Spacer
  2. ioutil.ReadDir
  3. os.Plik.Readdir

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    var (
        root  string
        files []string
        err   error
    )

    root := "/home/manigandan/golang/samples"
    // filepath.Walk
    files, err = FilePathWalkDir(root)
    if err != nil {
        panic(err)
    }
    // ioutil.ReadDir
    files, err = IOReadDir(root)
    if err != nil {
        panic(err)
    }
    //os.File.Readdir
    files, err = OSReadDir(root)
    if err != nil {
        panic(err)
    }

    for _, file := range files {
        fmt.Println(file)
    }
}
  1. korzystanie z filepath.Spacer

Pakiet path/filepath zapewnia poręczny sposób skanowania wszystkich plików w katalogu, automatycznie przeskanuje każdy podkatalog w katalog.

func FilePathWalkDir(root string) ([]string, error) {
    var files []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            files = append(files, path)
        }
        return nil
    })
    return files, err
}
  1. za pomocą ioutil.ReadDir

ioutil.ReadDir odczytuje katalog nazwany przez dirname i zwraca lista wpisów katalogowych posortowanych według nazwy pliku.

func IOReadDir(root string) ([]string, error) {
    var files []string
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}
  1. korzystanie z systemu operacyjnego.Plik.Readdir

Readdir odczytuje zawartość katalogu powiązanego z plikiem i zwraca kawałek o wartości do n FileInfo, tak jak zwracany przez Lstat, w kolejności katalogów. Kolejne wezwania na ten sam plik będzie / align = "left" /

func OSReadDir(root string) ([]string, error) {
    var files []string
    f, err := os.Open(root)
    if err != nil {
        return files, err
    }
    fileInfo, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return files, err
    }

    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}

Wyniki porównawcze.

punkt odniesienia

Dowiedz się więcej o tymblogu

 21
Author: manigandand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 15:18:07

ioutil.ReadDir jest dobrym znaleziskiem, ale jeśli klikniesz i spojrzysz na źródło, zobaczysz, że wywołuje metodę Readdir systemu operacyjnego.Plik . Jeśli nie masz nic przeciwko porządkowi katalogów i nie potrzebujesz posortowanej listy, to ta metoda Readdir jest wszystkim, czego potrzebujesz.

 19
Author: Sonia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 13:46:56