12
votes

Ruby Créer une arborescence de répertoires récursif

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.

Toute aide est appréciée.


0 commentaires

4 Réponses :


2
votes

Module de Ruby's Trouver ( Exiger 'Recherche' ) 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


1 commentaires

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.).



7
votes

Prenez d'abord votre arbre, convertissez-le en une liste de chemins à feuilles, similaires à: xxx pré>

(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> xxx pré>

puis, pour chaque chemin, appelez FLITUTILS # MKDIR_P CODE> : P>

{
  "baz"=>{
    "boo"=>{
      "bee"=>{}},
    "goo"=>{}},
  "foo"=>{
    "bar"=>{}}}


5 commentaires

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 ('** / *') + prédicat fichier.directory? (F) . 2 étoiles avec slash suffit ( dir.glob ('** /) )


Je ne peux pas visualiser comment remplir des fichiers de répertoire à l'intérieur du hachage de répertoire. Peux-tu expliquer?



25
votes

Vous voulez probablement quelque chose comme ceci (non testé): xxx

marchez récursivement dans l'arbre, construisant un hachage. Transformez-le en Json avec votre bibliothèque de sérialisation préférée.


1 commentaires

J'ai fait un petit changement pour empêcher la traversée trop loin: suivant si (entrée == '..' '|| entrée =='. ') Merci beaucoup pour votre aide. J'apprécie vraiment cela.



1
votes

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  


0 commentaires