Cómo comprobar si existe un directorio determinado en Ruby


Estoy tratando de escribir un script que automáticamente comprueba o actualiza una URL de Subversion basado en si existe un directorio especificado o no.

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?

 142
Author: the Tin Man, 2009-07-06

5 answers

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

Como un lado, 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. Así, podrías 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.

 249
Author: Emily,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-12 02:51:36

Todas las demás respuestas son correctas, sin embargo, es posible que tenga problemas si está tratando de verificar el directorio en el directorio personal de un usuario. Asegúrese de expandir la ruta relativa antes de comprobar:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
 33
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-31 21:57:01

También Se puede utilizar Dir::exist? así:

Dir.exist?('Directory Name')

Devuelve true si el 'Nombre del directorio' es un directorio, false de lo contrario.1

 32
Author: ma11hew28,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 22:20:50
File.exist?("directory")

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

Dir["directory"].empty?

Que devolverá truesi no fue encontrado.

 16
Author: cloudhead,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 23:00:16

Usted podría utilizar Kernel#test:

test ?d, 'some directory'
 6
Author: jtzero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 23:00:44