2011-07-12 39 views
6

Estoy tratando de encontrar la mejor y más rápida forma de saber si un archivo existe en un servidor ftp.¿Cómo se puede saber si existe un archivo FTP usando ruby?

Esto es lo que me ocurrió ...

def remote_exists?(idx) 
    #@file.rewind if @file.eof? 
    ftp = Net::FTP.new(FTP_SERVER) 
    ftp.login 
    begin 
    ftp.size(idx) 
    rescue Exception 
    return false 
    end 
    true 
end 

Parece que fue capturar todas las excepciones es una mala idea, pero tuve problemas para conseguir la excepción específica correcta (s).

También estoy usando OpenURI en mi código para realmente obtener el archivo. Estaba tratando de averiguar si eso podría tener algún método que podría ser mejor, pero creo que solo usa Net :: FTP de todos modos.

Respuesta

11

Creo que su enfoque parece estar bien, excepto por una cosa: no todos los servidores FTP admiten el comando SIZE, se introdujo en el Extensions of FTP, por lo que no hay garantía. Tu manejo de excepciones también es un poco grosero, como te has fijado. Sugeriría rescatar FTPReplyError específicamente. En caso de que le da una indicación no está implementado ese tamaño (500 o 502) que probablemente debería depender de un repliegue, más sobre esto después de que el código de actualización:

def remote_exists?(idx) 
    ftp = Net::FTP.new(FTP_SERVER) 
    ftp.login 
    begin 
    ftp.size(idx) 
    rescue FTPReplyError => e 
    reply = e.message 
    err_code = reply[0,3].to_i 
    unless err_code == 500 || err_code == 502 
     # other problem, raise 
     raise 
    end 
    # fallback solution 
    end 
    true 
end 

Un repliegue viable sería recuperar la lista de archivos con FTP#list, luego repítelos y compárelos con idx.

+1

El código podría preguntar al servidor si admite tamaño, pero enumerar los archivos, o el archivo en particular, y extraer el tamaño debería ser más universal, excepto que los servidores FTP no necesariamente se ajustan a un estándar para su listado. En un entorno dedicado/de uso único que es fácil de solucionar. En un cliente genérico, requiere más trabajo. –

Cuestiones relacionadas