IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Multiples conditions de if


Sujet :

Ruby

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Points : 53
    Points
    53
    Par défaut Multiples conditions de if
    Bonsoir à tous,

    Je démarre ruby, donc je tâtonne encore. J'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    monDossier = Dir.entries('.')
     
    monDossier.each do |x|
        if !File.executable?(x) and File.file(x)
            puts x
        end
        if File.directory?(x) and (x != File.directory?('.') and x != File.directory?('..'))
            puts "dossier"
        end
    end
    Mon problème est au niveau du 2ème if car j'aimerais lister tous les fichiers du dossier (mais pas des sous-dossiers), tout en excluant les dossiers . et ..

    Si vous connaissez d'autres moyens plus efficaces, je suis preneur. En gros je cherche certains fichiers dans les sous-dossiers (mais pas leurs sous-dossiers, j'espère être clair ) du dossier courant. L'équivalent d'un find serait pas mal aussi en fait mais au moins cette méthode me permettrait de voir comment arranger ce if.

    Bonne soirée et merci.

    EDIT : Je comprends que ceci : x != File.directory?('.') ne fonctionne pas mais je ne sais pas comment faire pour dire de ne pas rentrer dans la condition si x est '.' ou '..'

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Si j'ai bien compris, tu veux uniquement lister les fichiers (non dossier) du répertoire courrant ?

    Si c'est bien ça, je procèderai ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dir.entries('.').each do |filename|
            next if filename == "." || filename == ".."
            puts filename if File.directory?(filename)
    end
    next permet de passer à l'itération suivante.

    J'espère que ça résout ton soucis ;-)

  3. #3
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 190
    Points : 53
    Points
    53
    Par défaut
    Merci pour ta réponse, ton script m'a aidé, mais juste quelques modifications pour se que je cherche à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dir.entries('.').each do |filename|
    	next if filename == "." || filename == ".."
    	if File.directory?(filename)
    		Dir.entries(filename).each do |subFilename|
    			puts subFilename if !File.directory?(subFilename)
    		end
    	end
    	puts filename if !File.directory?(filename)
    end
    Est-ce que tu es d'accord avec ça ?

    EDIT : J'ai vu qu'on peut répéter des bouts de codes (yield ?) je pense qu'il y'a moyen de faire un peu plus simple. Uniquement le contenu des dossiers où se lance le script m'intéresse (et du dossier courant), pas les sous-sous dossier...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Je ferai juste un if...else plutôt que deux if pour le File.directory? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dir.entries('.').each do |filename|
    	next if filename == "." || filename == ".."
    	if File.directory?(filename)
    		Dir.entries(filename).each do |subFilename|
    			puts subFilename if !File.directory?(subFilename)
    		end
    	else
    	        puts filename
            end
    end
    Sinon, je ne pense pas que ce soit nécessaire de simplifier plus que ça dans ce cas

    Le yield te permet d'injecter du code en plein dans une fonction. Typiquement la méthode "each" que tu as utilisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dir.entries('.').each do |filename|
      # ton code
    end
    Le yield s'utilise comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def foo
            x = 42
            puts "Debut de la fonction"
            yield x
            puts "Fin de la fonction"
    end
     
    begin
            foo do |x|
                    puts "x = #{x}"
            end
    end
    Ce bout de code produit le résultat suivant :

    Debut de la fonction
    x = 42
    Fin de la fonction

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Et en utilisant select ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir.entries("dossier").select {|fic| !File.directory? fic}

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 11
    Points : 19
    Points
    19
    Par défaut
    Plus court en effet :-P Le seul problème avec le select, c'est que tu ne peux pas avoir les fichiers des sous-dossiers comme ils vont être skippé ;-)

  7. #7
    Nouveau membre du Club
    Profil pro
    Ingénieur
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Al3xisB Voir le message
    Et en utilisant select ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir.entries("dossier").select {|fic| !File.directory? fic}
    Version récursive ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir.glob("dossier/**/*").select {|fic| !File.directory? fic}
    -- Maurice

  8. #8
    Membre actif Avatar de rivsc
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 213
    Points : 275
    Points
    275
    Par défaut
    Encore un peu plus court :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir["/home/sylvain/*"].select {|fic| !File.directory? fic}
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dir["/home/sylvain/*/**"].select {|fic| !File.directory? fic}
    Sinon pour éviter ce genre de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    next if filename == "." || filename == ".."
    Je fais (plus pratique dans le cas de nouvelle exclusion) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    next if [".",".."].include?(filename)

Discussions similaires

  1. [XL-2003] boucle For avec multiple conditions d'arret
    Par yvespi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/05/2010, 09h30
  2. where et multiples conditions
    Par geofnich dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/04/2010, 10h34
  3. Plus propre que de multiples conditions
    Par koKoTis dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2008, 17h41
  4. Multiples conditions avec macro
    Par Toine45 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 27/12/2007, 15h24
  5. Multiples conditions - recherche de chaines de caractères
    Par nokiariver dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 11/12/2007, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo