Comment vérifier si un répertoire donné existe dans Ruby


163

J'essaie d'écrire un script qui vérifie ou met à jour automatiquement une URL Subversion en fonction de l'existence ou non d'un répertoire spécifié.

Pour une raison quelconque, mon code ne fonctionne pas et retourne toujours vrai même s'il est faux:

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

Qu'est-ce que je fais mal?

Réponses:


287

S'il est important de savoir si le fichier que vous recherchez est un répertoire et pas seulement un fichier, vous pouvez utiliser File.directory?ou Dir.exist?. Cela ne retournera vrai que si le fichier existe et est un répertoire.

En passant, une manière 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 l'é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.


139
Pourquoi se donner la peine de le mettre dans une autre méthode? Appelez-le directement!
Ryan Bigg

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

4
Ne serait pas Dir.exists?plus propre que File.directory??
Yo Ludke du

3
Dir.exists?est obsolète, utilisezDir.exist
fkoessler

4
@burningpony mon mauvais, c'estDir.exist?
fkoessler

42

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

Dir.exist?('Directory Name')

Renvoie truesi le 'Nom du répertoire' est un répertoire, falsesinon. 1


2
Cela semble nécessiter Ruby> 1.9 ou plus, sur 1.8, il retourne undefined method `exists?' for Dir:Class (NoMethodError). De plus, la forme plurielle est désormais obsolète, utilisez-la à la .exist?place.
Josip Rodin

40

Toutes les autres réponses sont correctes, cependant, vous pourriez avoir des problèmes si vous essayez de vérifier le répertoire dans le répertoire de base d'un utilisateur. Assurez-vous de développer le chemin relatif avant de vérifier:

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

18
File.exist?("directory")

Dir[]renvoie un tableau, donc il ne le sera jamais nil. Si tu veux le faire à ta façon, tu peux le faire

Dir["directory"].empty?

qui reviendra trues'il n'a pas été trouvé.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.