Bonjour,
Quelqu'un saurait-il pourquoi "Dir.entries(path).length" ne me retourne pas 0 quand le path est un dossier vide ?
if Dir.entries(path).length != 0 => rentre ds le if
if Dir.entries(path).length == 0 => ne rentre pas ds le if
Et je vous assure que le dossier "path" est bien vide de fichiers !
Sinon, comment afficher sa valeur dans le modèle pr débuguer ? Merci
C'est une problématique Ruby. Dans ce cas le mieux est d'utiliser irb en ligne de commande pour voir. Au moindre doute, pour tester une méthode que l'on ne maîtrise pas, irb c'est magique. Ci-dessous un exemple avec un répertoire 'toto' (c'est original) que j'ai créé et laissé vide :
irb(main):001:0> Dir.entries('toto') => [".", ".."] irb(main):002:0> Dir.entries('toto').length => 2
Je pense que ça répond à la question ;-)
Sam.
J'ai justement eu le même problème hier soir, ce qui est etonnant, c'est que :
Dir.glob(path)each do |f|.....
renvoit bien seulement les fichiers présents dans le répertoire
c'est plus long par contre ;-)
yohann
Glob, tu m'étonnes que ça soit plus long : il appelle un fnmatch derrière !
Le mieux serait de supprimer les deux premières entrées, via : files = Dir.entries(foobar) - '.' - '..'
Je me doutais qu'il y avait un problème de ce genre ("." et ".."). J'ai aussi vérifié avec irb. Si je comprends bien, IRB est le meilleur ami du débugueur ?
Voilà mon code de suppression de dossiers (avec ou sans fichiers dedans).
def before_destroy if self.url_title path = "#{RAILS_ROOT}/#{DOCUMENTS_ROOT}/#{self.url_title}" if File.directory?(path) and File.exists?(path) if Dir.entries(path).length < 3 Dir.delete(path) else Dir.foreach(path) do |file| FileUtils.rm_rf(path + '/' + file) if file != "." or file != ".." end end end end end
Merci à tous les deux.
Un très bon ami même !
irb tout seul, te permet de bricoler tranquillement avec Ruby. Quand veut tester un truc basé sur des map, select, ... avec des hash et des tableaux à n'en plus finir, tu prends irb. Tu as ta réponse de suite, sans avoir à tester avec tout RoR.
Après tu as la même chose pour RoR : la console. Là encore tu peux gagner pas mal de temps à tester / debugger en allant à l'essentiel. Pour plus d'info voir ici une approche simple et rapide :
http://slash7.com/articles/2006/12/21/secrets-of-the-rails-console-ninjas
La console est longue à démarrer sous windows (utilise reload! au maximum pour gagner du temps). Pour tester une bricole avec Ruby mieux veut prendre irb.
Merci sam.
Je ne connaissais pas la console non plus ! (je suis sous OS X)
Un moyen simple de nettoyer est de passer par un filtre.
> Dir.entries('.').delete_if {|x| x=='.' or x=='..'}.length => 0
S'il y a plus élégant, je prends.
Dir.entries('.').grep(/^[^\.]/)
Un peu plus simple : (Dir.entries('.')-['.','..']).length et cela ne pose aucun problème si '.' ou '..' ne figurent pas initialement dans la liste.
(Dir.entries('.')-['.','..']).length
railsfrance.org - communauté francophone des utilisateurs de Ruby on Rails [ Hébergement et ressources techniques gracieusement fournis par la SSLL Nuxos Group ]
il y a 1 jour 20 heures
il y a 6 jours 5 heures
il y a 1 semaine 4 jours
il y a 1 semaine 4 jours
il y a 1 semaine 4 jours
il y a 2 semaines 3 jours
il y a 2 semaines 4 jours
il y a 2 semaines 5 jours
il y a 2 semaines 6 jours
il y a 3 semaines 1 jour