Cómo verificar si un directorio dado existe en Ruby

163

Estoy tratando de escribir un script que compruebe o actualice automáticamente una URL de Subversion en función de si existe o no un directorio específico.

Por alguna razón, mi código no funciona y siempre devuelve verdadero incluso si es falso:

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

¿Qué estoy haciendo mal?

Ceniza
fuente

Respuestas:

287

Si importa si el archivo que está buscando es un directorio y no solo un archivo, puede usar File.directory?o Dir.exist?. Esto devolverá verdadero solo si el archivo existe y es un directorio.

Además, una forma más idiomática de escribir el método sería aprovechar el hecho de que Ruby devuelve automáticamente el resultado de la última expresión dentro del método. Por lo tanto, podría escribirlo así:

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

Tenga en cuenta que el uso de un método no es necesario en el presente caso.

Emily
fuente
139
¿Por qué molestarse incluso en ponerlo dentro de otro método? ¡Solo llámalo directamente!
Ryan Bigg el
11
@ Radar Pensé que el método simplificado probablemente se simplificó para el propósito de la pregunta y que el método real podría contener alguna lógica adicional. Si no hay otra lógica necesaria en el método, estoy de acuerdo. Por supuesto, solo ejecuta el directorio? directamente.
Emily
44
No sería Dir.exists?no ser más limpio que File.directory??
Yo Ludke
3
Dir.exists?está en desuso, useDir.exist
fkoessler
44
@burningpony mi mal, esDir.exist?
fkoessler 03 de
42

También puedes usar Dir::exist?así:

Dir.exist?('Directory Name')

Devuelve truesi el 'Nombre del directorio' es un directorio, de lo falsecontrario. 1

ma11hew28
fuente
2
Esto parece requerir Ruby> 1.9 más o menos, en 1.8 vuelve undefined method `exists?' for Dir:Class (NoMethodError). Además, la forma plural ahora está en desuso, use .exist?en su lugar.
Josip Rodin
40

Todas las otras respuestas son correctas, sin embargo, puede tener problemas si está tratando de verificar el directorio en el directorio de inicio de un usuario. Asegúrese de expandir la ruta relativa antes de verificar:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
Andrés
fuente
18
File.exist?("directory")

Dir[]devuelve una matriz, por lo que nunca será nil. Si quieres hacerlo a tu manera, puedes hacerlo

Dir["directory"].empty?

que volverá truesi no se encontró.

cabeza de nube
fuente
7

Podrías usar Kernel#test:

test ?d, 'some directory'

obtiene sus orígenes de https://ss64.com/bash/test.html , notará que bash testtiene esta bandera -dpara probar si existe un directorio -d file True if file is a Directory. [[ -d demofile ]]

jtzero
fuente
1
Esto está bien. No es el más expresivo de inmediato , pero ordenado.
kayleeFrye_onDeck