2009-07-06 17 views
138

Estoy tratando de escribir un script que verifique o actualice automáticamente una URL de Subversion en función de si existe un directorio especificado o no.Cómo verificar si existe un directorio determinado en Ruby

Por alguna razón, mi código no está funcionando y siempre devuelve cierto incluso si es falsa:

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

¿Qué estoy haciendo mal?

Respuesta

238

si importa si el archivo que está buscando es un directorio y no sólo un archivo, se puede usar File.directory? o Dir.exist?. Esto devolverá verdadero 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. Por lo tanto, podría escribirlo así:

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

Tenga en cuenta que no es necesario utilizar un método en este caso.

+3

Sólo un enlace a la mana: http://www.ruby-doc.org/core/classes/File.html#M002555 – Nippysaurus

+110

¿Por qué molestarse incluso en ponerlo dentro de otro método? ¡Simplemente llámalo directamente! –

+9

@Radar Me imaginé que el método simplificado probablemente se simplificó a los fines de la pregunta y que el método real podría contener alguna lógica adicional. Si no se necesita otra lógica en el método, estoy de acuerdo. Por supuesto, solo ejecute el directorio? directamente. – Emily

15
File.exist?("directory") 

Dir[] devuelve una matriz, por lo que nunca habrá nil. Si quiere hacerlo a su manera, se podría hacer

Dir["directory"].empty? 

que devolverá true si no fue encontrado.

32

Todas las otras respuestas son correctas, sin embargo, puede tener problemas si está intentando verificar el directorio en el directorio de inicio 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 
29

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

Dir.exist?('Directory Name') 

devoluciones true si el 'nombre del directorio' es un directorio, false lo contrario. 1

+2

Esto parece requerir Ruby> 1.9 o menos, en 1.8 devuelve 'método indefinido \' existe? ' para Dir: Class (NoMethodError) '.Además, la forma plural ahora está en desuso, use '.exist?' En su lugar. –

5

Usted podría utilizar Kernel#test:

test ?d, 'some directory' 
+1

Felicitaciones por eso. No tenía ni idea. Muy útil, gracias! – dimitarvp

+0

Esto es limpio. No es el más inmediato _expresivo_, pero ordenado. –

Cuestiones relacionadas