J'ai essayé de comprendre comment répertorier simplement les fichiers et les dossiers dans un seul répertoire dans Go.
J'ai trouvé filepath.Walk
, mais il entre 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é très difficile à trouver. Faites-moi savoir si quelqu'un sait où je devrais regarder. Merci.
Vous pouvez essayer d'utiliser la fonction ReadDir dans le package io/ioutil
. Selon les documents:
ReadDir lit le répertoire nommé par dirname et renvoie la liste des entrées de répertoire triées.
La tranche résultante contient les types os.FileInfo
, qui fournissent les méthodes répertoriées ici . Voici un exemple de base qui répertorie le nom de tout ce qui se trouve dans le répertoire en cours (les dossiers sont inclus mais pas spécialement marqués - vous pouvez vérifier si un élément est un dossier en utilisant la méthode 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())
}
}
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 du système de fichiers en utilisant diverses fonctions de la bibliothèque standard de golang.
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)
}
}
Le paquetage
path/filepath
constitue un moyen pratique d’analyser tous les fichiers d’un répertoire. Il analysera automatiquement chaque sous-répertoire du 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
}
ioutil.ReadDir
lit le répertoire nommé par nom et renvoie une liste d'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
}
Readdir lit le contenu du répertoire associé au fichier et renvoie une tranche de n valeurs FileInfo au maximum, comme le ferait Lstat, dans l'ordre des répertoires. Des appels ultérieurs sur le même fichier donneront plus de 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 à ce sujet Blog Post
ioutil.ReadDir
est une bonne trouvaille, mais si vous cliquez et regardez la source, vous voyez qu'elle appelle la méthode Readdir of os.File . Si vous êtes d'accord avec l'ordre des répertoires et que vous n'avez pas besoin de trier la liste, cette méthode Readdir est tout ce dont vous avez besoin.