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 サーバーがコマンドをサポートしているわけではなく、 FTP の拡張機能でSIZE導入されたため、保証はありません。お気づきのように、例外処理も少し粗いです。具体的に救助することをお勧めします。SIZE が実装されていないことを示している場合 (500 または 502)、おそらくフォールバックに依存する必要があります。更新されたコードの後でそれについて詳しく説明します。FTPReplyError

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 に答える