2011-07-12 156 views
6

我试图找出最好和最快的方法来判断一个文件是否存在于ftp服务器上。如何判断一个FTP文件是否存在使用ruby?

这是我想出了...

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 

好像只是捕捉每一个异常是一个坏主意,但我有麻烦了正确的特定异常(一个或多个)。

我也在我的代码中使用OpenURI来实际获取文件。我试图找出是否可能有更好的方法,但我认为它只是使用Net :: FTP。

回答

11

我认为你的方法似乎很好,除了一件事情:并非所有的FTP服务器都支持SIZE命令,它是在Extensions of FTP中引入的,所以不能保证。正如你注意到你自己,你的异常处理也有点粗糙。我建议具体解救FTPReplyError。在情况下,它给你一个迹象表明,SIZE未实现(500或502),你或许应该依赖备用,更多的是更新的代码之后:

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 

一个可行的回退将检索列表文件与FTP#list,然后遍历它们并与idx比较。

+1

代码可以询问服务器是否支持大小,但列出文件或特定文件并提取大小应该更通用 - 除了FTP服务器不一定符合其列表的标准。在一个易于解决的专用/一次性使用的环境中。在通用客户端中需要更多的工作。 –

相关问题