Répertoire de liste dans Go
J'ai essayé de comprendre comment lister simplement les fichiers et les dossiers dans un seul répertoire dans Go.
J'ai trouvé filepath.Walk
, mais il va automatiquement dans les sous-répertoires, ce que je ne veux pas. Toutes mes autres recherches n'ont rien donné de mieux.
Je suis sûr que cette fonctionnalité existe, mais elle a été vraiment difficile à trouver. Laissez-moi savoir si quelqu'un sait où je devrais regarder. Grâce.
4 réponses
Vous pouvez essayer d'utiliser la fonction ReadDir dans le paquet io/ioutil
. Selon les docs:
ReadDir lit le répertoire nommé par dirname et renvoie une liste d'entrées de répertoire triées.
La tranche obtenue contient os.FileInfo
types, qui fournissent les méthodes énumérées ici. Voici un exemple de base qui répertorie le nom de tout dans le répertoire courant (les dossiers sont inclus mais pas spécialement marqués - vous pouvez vérifier si un élément est un dossier en utilisant le IsDir()
méthode):
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())
}
}
Encore plus simple, utilisez 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
}
Nous pouvons obtenir une liste de fichiers dans un dossier sur le système de fichiers en utilisant diverses fonctions de bibliothèque standard golang.
- chemin d'accès du fichier.Marche
- ioutil.ReadDir
- os.Fichier.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)
}
}
- utilisation de filepath.Marche
Le paquet
path/filepath
fournit un moyen pratique d'analyser tous les fichiers dans un répertoire, il analysera automatiquement chaque sous-répertoire dans le répertoire.
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
}
- en utilisant ioutil.ReadDir
ioutil.ReadDir
lit le répertoire nommé par dirname et renvoie un liste des entrées de répertoire triées par nom de fichier.
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
}
- Utilisation du système d'exploitation.Fichier.Readdir
Readdir lit le contenu du répertoire associé à file et renvoie une tranche allant jusqu'à n valeurs FileInfo, comme cela serait renvoyé par Lstat, dans l'ordre du répertoire. Appels ultérieurs sur le même fichier rendement plus 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
}
Résultats de référence.
Obtenez plus de détails sur ce blog Post
ioutil.ReadDir
est une bonne trouvaille, mais si vous cliquez et regardez le code source, vous voyez qu'il appelle la méthode Readdir de l'os.Fichier . Si vous êtes d'accord avec l'ordre du répertoire et n'avez pas besoin de la liste triée, alors cette méthode Readdir est tout ce dont vous avez besoin.