6

我试图找出最好和最快的方法来判断文件是否存在于 ftp 服务器上。

这就是我想出的...

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 无论如何。

4

1 回答 1

12

我认为您的方法似乎很好,除了一件事:并非所有 FTP 服务器都支持该SIZE命令,它是在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

于 2011-07-12T19:13:04.973 回答