Как узнать, существует ли файл FTP с использованием ruby? - PullRequest
6 голосов
/ 12 июля 2011

Я пытаюсь найти лучший и самый быстрый способ узнать, существует ли файл на 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.

1 Ответ

12 голосов
/ 12 июля 2011

Я думаю, что ваш подход выглядит хорошо, за исключением одного: не все 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.

...