2011-02-04 21 views
51

¿Hay una forma única de detectar si un directorio/archivo/enlace simbólico/etc. entidad (más generalizada) existe?Cómo verificar si existe un directorio/archivo/enlace simbólico con un comando en Ruby

Necesito una sola función porque necesito verificar una serie de rutas que podrían ser directorios, archivos o enlaces simbólicos. Sé que File.exists?"file_path" funciona para directorios y archivos pero no para enlaces simbólicos (que es File.symlink?"symlink_path").

+1

¿Qué versión de Ruby está utilizando? ¿El archivo existe? trabaja para enlaces simbólicos para mí en Ruby 1.9.2 en OS X 10.6.6 –

+1

Para aclarar: para enlaces simbólicos, estás pidiendo algo que devuelva 'verdadero' si existe el enlace simbólico, independientemente de si puede resolverse en última instancia a un no -symlink Es decir. debería devolver 'true' para enlaces rotos también. 'File.exists?' Solo devolverá 'true' para un enlace simbólico que no esté roto. – Kelvin

Respuesta

102

El módulo de archivos estándar tiene la costumbre file tests disponibles:

RUBY_VERSION # => "1.9.2" 
bashrc = ENV['HOME'] + '/.bashrc' 
File.exist?(bashrc) # => true 
File.file?(bashrc) # => true 
File.directory?(bashrc) # => false 

usted debería ser capaz de encontrar lo que quiere allí.


OP: "Gracias pero necesito los tres verdadero o falso"

Obviamente no

. Ok, intente algo como:

def file_dir_or_symlink_exists?(path_to_file) 
    File.exist?(path_to_file) || File.symlink?(path_to_file) 
end 

file_dir_or_symlink_exists?(bashrc)       # => true 
file_dir_or_symlink_exists?('/Users')       # => true 
file_dir_or_symlink_exists?('/usr/bin/ruby')     # => true 
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false 
+0

Aconsejaría no hacer la concatenación de cadenas sin formato ('ENV [ 'HOME'] + '/ .bashrc'') que puede no funcionar multiplataforma. Deberías usar uniones de Ruby File y también por qué no comenzar desde 'Rails.root' si estás usando Rails. 'File.exists? (Rails.root.join ('db', 'my_seeds.csv ') ' –

+1

Está garantizado que no funciona multiplataforma ya que Windows no conoce Bash, y por lo tanto, acerca de .bashrc. Pero funcionaría en una plataforma basada en * nix. Sin embargo, el uso de '/' no es el problema, ya que [IO de Ruby convierte automáticamente de barras diagonales a barras diagonales inversas en Windows] (http://ruby-doc.org/core-2.3.3/IO.html). –

11

¿Por qué no define su propia función File.exists?(path) or File.symlink?(path) y la usa?

+0

Por supuesto que puedo hacer eso, pero me gustaría una forma ya implementada que pueda verificar ambas. Quiero decir si en ese camino hay 'algo'. – Clawsy

+1

@Clawsy Creo que te estás perdiendo el punto de Gintautas: eres un programador: si la función que necesitas no existe, puedes crearla. – Telemachus

+0

No, no me estoy perdiendo el punto :). Entiendo perfectamente. Solo quiero agregar el menor código posible a mi aplicación. En mi caso, es mejor (para cuestiones de ingeniería de software) si encuentro un método como ese. Si no, eso es ... Hago uno, no hay problema. Solo quería saber si hay uno predefinido. No soy flojo, es solo insertar un código en una aplicación ENORME que debe ser muy bien cuidada. Solo quería saber eso ... porque no quiero repetirme. (SECO - No repetir, del programa de programador pragmático: D). – Clawsy

Cuestiones relacionadas