- J'ai besoin d'écrire une fonction qui, lorsqu'on lui donne le chemin d'un dossier, analyse les fichiers enracinés dans ce dossier.
- Et puis j'ai besoin d'afficher la structure de répertoires dans ce dossier.
Je sais comment faire 2 (je vais utiliser jstree pour l'afficher dans le navigateur).
Réponses:
EDIT : Assez de gens ont encore répondu à cette réponse, que j'ai pensé la mettre à jour pour l'API Go1. Ceci est un exemple fonctionnel de filepath.Walk () . L'original est ci-dessous.
Veuillez noter que filepath.Walk parcourt l'arborescence des répertoires de manière récursive.
Ceci est un exemple d'exécution:
RÉPONSE ORIGINALE SUIT: L'interface pour parcourir les chemins de fichiers a changé à partir du 16 septembre 2011, voir http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218 . Le code ci-dessous ne fonctionnera pas pour les versions de GO dans un proche avenir.
Il y a en fait une fonction dans la bibliothèque standard juste pour cela: filepath.Walk .
la source
filepath.Walk
ne suit pas les liens symboliques d'ailleurs.filepath.Walk
rappel @FrancescoPasa sera déclenché sur les liens symboliques (fichier et répertoire). Oui, il ne les suivra pas, mais le callback reconnaît un lien symbolique et prend des mesures supplémentaires, c'est-à-dire un suivifilepath.Walk
assurant d'abord que le chemin n'a pas déjà été visité.Voici un moyen d'obtenir des informations sur les fichiers d'un répertoire.
la source
Readdir
paramètre de méthode estn
unint
. Sin <= 0
,Readdir
renvoie tous lesFileInfo
du répertoire en une seule tranche.os
func (FileMode) IsRegular
.Voici un exemple pour parcourir tous les fichiers et répertoires de manière récursive. Notez que si vous voulez savoir si le chemin que vous ajoutez est un répertoire, cochez simplement "f.IsDir ()".
la source
main
méthode ne devrait pas avoir d'([]string, error)
arguments et vous devez faire quelque chose avecerr
. À moins qu'au moment de répondre, il était valide? Certainement une erreur de compilation dans les versions plus récentes. Sinon, très utile, merci.Le package
github.com/kr/fs
fournit uneWalker
API très intéressante.la source
Le package standard Go
ioutil
a une fonction intégrée pour ce scénario de cas, voir l'exemple ci-dessousla source
Notez que "Walk ne suit pas les liens symboliques" donc si vous cherchez à écrire une fonction qui fait cela, je recommande ioutil.ReadDir . Mon propre test de référence a montré qu'il est plus rapide et moins gourmand en mémoire que filepath.Glob .
De plus,
ioutil.ReadDir
trie les fichiers par nom de base à l'aide de la comparaison de chaînes de base (strA > strB
). En tant que développeur devops, je trie généralement les noms de répertoires en faisant une comparaison numérique inversée (la dernière version en premier par exemple). Si c'est également votre cas, il est préférable d'appeler directement os.ReadDir (il l'ioutil.ReadDir
appelle sous les couvertures) et de faire le tri vous-même.Voici un exemple de la
ReadDir
pièce avec tri numérique:la source
Vous voudrez peut-être faire le currying des fonctions ici, afin de pouvoir utiliser pleinement la recherche
la source