2011-07-12 25 views
6

Tôi đang cố gắng tìm ra cách tốt nhất và nhanh nhất để biết tệp có tồn tại trên máy chủ ftp hay không.Làm cách nào để biết tệp FTP có tồn tại bằng ruby ​​không?

Đây là những gì tôi đã đưa ra ...

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 

Nó có vẻ như chỉ chụp mỗi ngoại lệ là một ý tưởng tồi nhưng tôi gặp rắc rối khi các ngoại lệ cụ thể chính xác (s).

Tôi cũng đang sử dụng OpenURI trong mã của mình để thực sự nhận tệp. Tôi đã cố gắng tìm ra nếu có thể có một số phương pháp có thể tốt hơn nhưng tôi nghĩ rằng nó chỉ sử dụng Net :: FTP anyway.

Trả lời

11

Tôi nghĩ rằng cách tiếp cận của bạn có vẻ tốt ngoại trừ một điều: không phải tất cả máy chủ FTP hỗ trợ lệnh SIZE, nó được giới thiệu trong Extensions of FTP, vì vậy không có bảo đảm. Xử lý ngoại lệ của bạn cũng là một chút thô, như bạn nhận thấy chính mình. Tôi sẽ đề nghị giải cứu FTPReplyError một cách cụ thể. Trong trường hợp nó mang lại cho bạn một dấu hiệu SIZE đó không được thực hiện (500 hoặc 502) có lẽ bạn nên dựa vào một dự phòng, thêm vào đó sau khi mã Cập nhật:

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 

Một dự phòng khả thi sẽ được lấy lại danh sách tệp với FTP#list, sau đó lặp lại qua chúng và so sánh với idx.

+1

Mã có thể hỏi máy chủ xem nó có hỗ trợ kích thước hay không, nhưng liệt kê tệp hoặc tệp cụ thể và việc giải nén kích thước phải phổ biến hơn - ngoại trừ máy chủ FTP không nhất thiết phải tuân thủ tiêu chuẩn cho danh sách của chúng. Trong một môi trường chuyên dụng/đơn sử dụng dễ dàng để làm việc xung quanh. Trong một máy khách chung, nó cần nhiều công việc hơn. –

Các vấn đề liên quan