我正在试图找出判断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。
答案 0 :(得分:12)
我认为你的方法似乎很好,除了一件事:并非所有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
进行比较。