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