2009-07-06 7 views
138

J'essaie d'écrire un script qui extrait ou met à jour automatiquement une URL Subversion selon qu'un répertoire spécifié existe ou non.Comment vérifier si un répertoire donné existe dans Ruby

Pour une raison quelconque, mon code ne fonctionne pas et retourne toujours vrai même si elle est fausse:

def directory_exists?(directory) 
    return false if Dir[directory] == nil 
    true 
end 

Qu'est-ce que je fais mal?

Répondre

238

S'il importe si le fichier que vous cherchez est un répertoire et pas seulement un fichier, vous pouvez utiliser File.directory? ou Dir.exist?. Cela retournera vrai seulement si le fichier existe et est un répertoire. En passant, un moyen plus idiomatique d'écrire la méthode serait de tirer parti du fait que Ruby renvoie automatiquement le résultat de la dernière expression à l'intérieur de la méthode. Ainsi, vous pouvez écrire comme ceci:

def directory_exists?(directory) 
    File.directory?(directory) 
end 

Notez que l'utilisation d'une méthode n'est pas nécessaire dans le cas présent.

+3

Juste un lien vers le Doco: http://www.ruby-doc.org/core/classes/File.html#M002555 – Nippysaurus

+110

Pourquoi s'embêter à le mettre dans une autre méthode? Appelez-le directement! –

+9

@Radar J'ai pensé que la méthode simplifiée était probablement simplifiée aux fins de la question et que la méthode actuelle pourrait contenir une logique supplémentaire. Si aucune autre logique ne doit aller dans la méthode, je suis d'accord. Par tous les moyens, il suffit d'exécuter le répertoire? directement. – Emily

15
File.exist?("directory") 

Dir[] retourne un tableau, donc il ne sera jamais nil. Si vous voulez faire votre chemin, vous pourriez faire

Dir["directory"].empty? 

qui retournera true si elle n'a pas été trouvé.

32

Toutes les autres réponses sont correctes, cependant, vous pouvez rencontrer des problèmes si vous essayez de vérifier le répertoire dans le répertoire personnel d'un utilisateur. Assurez-vous que vous développez le chemin relatif avant de vérifier:

File.exists? '~/exists' 
=> false 
File.directory? '~/exists' 
=> false 
File.exists? File.expand_path('~/exists') 
=> true 
29

Vous pouvez également utiliser Dir::exist? comme ceci:

Dir.exist?('Directory Name') 

Retours true si le « Nom du répertoire » est un répertoire, false autrement. 1

+2

Cela semble exiger Ruby> 1.9 ou plus, sur 1.8 il renvoie 'méthode indéfinie \' existe? ' pour Dir: Class (NoMethodError) '.De plus, la forme plurielle est maintenant obsolète, utilisez '.exist?' À la place. –

5

Vous pouvez utiliser Kernel#test:

test ?d, 'some directory' 
+1

Félicitations pour cela. Je n'en avais aucune idée. Très utile, merci! – dimitarvp

+0

C'est propre. Pas le plus immédiatement expressif, mais soigné. –

Questions connexes