2013-02-03 1 views
79

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

Znalazłem filepath.Walk, ale automatycznie przechodzi do podkatalogów, których nie chcę. Wszystkie inne moje wyszukiwania nie zmieniły nic lepszego.

Jestem pewien, że ta funkcja istnieje, ale naprawdę trudno ją znaleźć. Daj mi znać, jeśli ktoś wie, gdzie powinienem wyglądać. Dzięki.

Odpowiedz

168

Możesz spróbować użyć funkcji ReadDir w pakiecie . Dla dokumentów:

ReadDir odczytuje katalog nazwany przez dirname i zwraca listę posortowanych pozycji katalogu.

Powstały kawałek zawiera typy os.FileInfo, które udostępniają wymienione metody: here. Oto prosty przykład, który wymienia nazwisko wszystko w bieżącym katalogu (foldery są włączone, ale nie specjalnie oznakowane - można sprawdzić, czy dany przedmiot jest folder przy użyciu metody IsDir()):

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()) 
    } 
} 
+1

Dziękuję bardzo. Szukałem czegoś takiego przez> 1 godzinę. –

+0

@BehramMistree Żaden problem - zdałem sobie sprawę, że nie upuściłem tam linku do rzeczywistego pakietu 'ioutil', więc dodam go dla dobra potomności. Powodzenia ze wszystkim :) – RocketDonkey

+0

Ale proszę nie ignorować błędu zwracanego przez ReadDir ... – Deleplace

17

ioutil.ReadDir jest dobre znalezisko, ale jeśli klikniesz i spojrzysz na źródło, zobaczysz, że nazywa się to metodą Readdir of os.File. Jeśli wszystko jest w porządku z kolejnością katalogów i nie trzeba sortować listy, to ta metoda Readdir jest wszystkim, czego potrzebujesz.

44

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 
} 
+0

Działa świetnie: func main() { \t jeśli l, err: = plik ścieżki.Glob ("/ tmp/lang/locale_ * .json "); eee! = nil { \t \t fmt.Println (ERR) \t} else { \t \t fmt.Println (l) \t} \t } – RoboTamer

+3

Zauważ, że 'Glob ignoruje błędy systemu plików, takich jak czytanie I/O błędy katalogi. Jedynym możliwym zwróconym błędem jest ErrBadPattern, gdy wzór jest zniekształcony. " – Jon

+1

Pamiętaj, aby zrozumieć, co robi Glob przed jego użyciem. https://golang.org/pkg/path/filepath/#Glob – AJPennster

0

możemy uzyskać listę plików w folderze w systemie plików przy użyciu różnych funkcji bibliotecznych golang standardowe.

  1. filepath.Walk
  2. ioutil.ReadDir
  3. os.File.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. Stosując filepath.Walk

Pakiet path/filepath zapewnia wygodny sposób, aby skanować wszystkie pliki w katalogu, zostanie ona automatycznie skanować każdy podkatalogów w katalogu .

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. Stosując ioutil.Readdir

ioutil.ReadDir odczytuje katalog o nazwie przez dirname i zwraca listę wpisów do katalogów 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 os.File.Readdir

readdir odczytuje zawartość katalogu związanego z plikiem i zwraca kawałek do n wartości FileInfo, które zostaną zwrócone przez Lstat, w kolejności katalogów. Kolejne wywołania tego samego pliku pozwolą uzyskać więcej informacji o FileInfos.

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 benchmarku.

benchmark score

uzyskać więcej szczegółów na ten Blog Post