EDIT POUR 1.16 : Il y a encore suffisamment de personnes qui consultent cette réponse, pour que je pense la mettre à jour pour Go 1.16.
La fonction filepath.WalkDir introduit dans Go 1.16 a de meilleures performances que filepath.Walk mentionné dans l'édition précédente. Voici un exemple fonctionnel :
package main
import (
"flag"
"fmt"
"io/fs"
"path/filepath"
)
func visit(path string, di fs.DirEntry, err error) error {
fmt.Printf("Visited: %s\n", path)
return nil
}
func main() {
flag.Parse()
root := flag.Arg(0)
err := filepath.WalkDir(root, visit)
fmt.Printf("filepath.WalkDir() returned %v\n", err)
}
EDIT : Il y a encore suffisamment de personnes qui consultent cette réponse pour que je la mette à jour pour l'API Go1. Il s'agit d'un exemple fonctionnel de filepath.Walk() . L'original est ci-dessous.
package main
import (
"path/filepath"
"os"
"flag"
"fmt"
)
func visit(path string, f os.FileInfo, err error) error {
fmt.Printf("Visited: %s\n", path)
return nil
}
func main() {
flag.Parse()
root := flag.Arg(0)
err := filepath.Walk(root, visit)
fmt.Printf("filepath.Walk() returned %v\n", err)
}
Veuillez noter que filepath.walk l'arbre des répertoires de manière récursive.
Il s'agit d'un exemple d'exécution :
$ mkdir -p dir1/dir2
$ touch dir1/file1 dir1/dir2/file2
$ go run walk.go dir1
Visited: dir1
Visited: dir1/dir2
Visited: dir1/dir2/file2
Visited: dir1/file1
filepath.Walk() returned <nil>
LA RÉPONSE ORIGINALE SUIT : L'interface permettant de parcourir les chemins de fichiers a été modifiée à partir de la semaine 2011-09-16, cf. http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218 . Le code ci-dessous ne fonctionnera pas pour les versions de GO dans un avenir proche.
Il y a en fait une fonction dans la librairie standard juste pour ça : filepath.Walk .
package main
import (
"path/filepath"
"os"
"flag"
)
type visitor int
// THIS CODE NO LONGER WORKS, PLEASE SEE ABOVE
func (v visitor) VisitDir(path string, f *os.FileInfo) bool {
println(path)
return true
}
func (v visitor) VisitFile(path string, f *os.FileInfo) {
println(path)
}
func main() {
root := flag.Arg(0)
filepath.Walk(root, visitor(0), nil)
}
2 votes
Avez-vous besoin qu'il parcoure l'arborescence des répertoires de manière récursive ?