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?

Cendre
la source

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.

Emilie
la source
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

ma11hew28
la source
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
Andrew
la source
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é.

nuage
la source
7

Vous pouvez utiliser Kernel#test:

test ?d, 'some directory'

il tire ses origines de https://ss64.com/bash/test.html vous remarquerez que bash testa cet indicateur -dpour tester si un répertoire existe -d file True if file is a Directory. [[ -d demofile ]]

jtzero
la source
1
C'est chouette. Pas le plus immédiatement expressif , mais soigné.
kayleeFrye_onDeck