J'ai besoin de traverser de manière récursive un répertoire et de créer un arborescence à utiliser avec le contrôle de contrôle Jstere . Le contrôle accepte un format JSON comme . J'ai besoin de la magie de rubis pour que cela se produise proprement et rapidement. P>
Toute aide est appréciée. P>
4 Réponses :
Module de Ruby's Trouver ( Exiger 'Recherche' Code>) est minimaliste mais gère le répertoire de répertoire de la répertoire: http://www.ruby-doc.org/stdlib/libdoc/find/rdoc/classes/find.html P>
Merci pour votre réponse rapide. J'essaie d'utiliser la recherche mais je suis incertain de la manière de créer la structure nécessaire pour l'arborescence (par exemple, un répertoire d'un des sous-répertoires et d'enfants, etc.).
Prenez d'abord votre arbre, convertissez-le en une liste de chemins à feuilles, similaires à: (non sûr si ci-dessus suit exactement votre structure Jstere, mais le principe est identique. ) p> Voici un échantillon d'entrée et de sortie: p> puis, pour chaque chemin, appelez FLITUTILS # MKDIR_P CODE>
: P> {
"baz"=>{
"boo"=>{
"bee"=>{}},
"goo"=>{}},
"foo"=>{
"bar"=>{}}}
Hey, merci beaucoup pour la réponse. J'aurais peut-être pu être incertain dans mon post original, mais je n'ai pas besoin de créer des répertoires mais de répertorier récursivement tous les fichiers / répertoires existants donnés sur un chemin.
Merci beaucoup pour votre aide. Le code fonctionne bien, mais n'atteignez que des annuaires, sans danger suffisamment simples pour modifier. Appréciez-le.
Cela m'a aidé purement pour le mkdir_p ()
Vous n'avez pas à utiliser dir.glob ('** / *') code> + prédicat
fichier.directory? (F) code>. 2 étoiles avec slash suffit (
dir.glob ('** /) code>)
Je ne peux pas visualiser comment remplir des fichiers de répertoire à l'intérieur du hachage de répertoire. Peux-tu expliquer?
Vous voulez probablement quelque chose comme ceci (non testé): marchez récursivement dans l'arbre, construisant un hachage. Transformez-le en Json avec votre bibliothèque de sérialisation préférée. P> p>
J'ai fait un petit changement pour empêcher la traversée trop loin: suivant si (entrée == '..' '|| entrée =='. ') Code> Merci beaucoup pour votre aide. J'apprécie vraiment cela.
La réponse acceptée n'a pas fonctionné en juin 2015. J'ai changé la clé : données code> sur
'text' code>. J'ai aussi généralisé le code pour exclure les annuaires et les fichiers.
def directory_hash(path, name=nil, exclude = [])
exclude.concat(['..', '.', '.git', '__MACOSX', '.DS_Store'])
data = {'text' => (name || path)}
data[:children] = children = []
Dir.foreach(path) do |entry|
next if exclude.include?(entry)
full_path = File.join(path, entry)
if File.directory?(full_path)
children << directory_hash(full_path, entry)
else
children << {'icon' => 'jstree-file', 'text' => entry}
end
end
return data
end