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?

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.


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


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

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ó.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.