2013-01-22 11 views
18

Tôi có một ứng dụng máy quét tập tin trong Java, mà giữ quét một thư mục trên một máy chủ bằng cách sử dụng FTP. nhận danh sách các tệp của thư mục và tải xuống từng tệp một. ở phía bên kia, trên máy chủ, có một quá trình ghi các tệp này. nếu tôi may mắn, tôi sẽ không cố gắng tải xuống tệp chưa hoàn chỉnh nhưng làm cách nào để đảm bảo quá trình ghi trên máy chủ hoàn tất và xử lý tệp được đóng và tệp sẵn sàng để tải xuống?Làm cách nào để biết tệp hoàn tất trên máy chủ bằng FTP?

Tôi không kiểm soát được quá trình ghi trên máy chủ. hơn nữa, tôi không có quyền ghi trên thư mục để cố gắng để có được một xử lý ghi để kiểm tra xem đã có một xử lý ghi mở, do đó, tùy chọn này là tắt bảng.

Có chức năng FTP nào đang giải quyết vấn đề này không?

+4

Điều tốt nhất bạn có thể làm là xem tệp chưa được sửa đổi trong một khoảng thời gian, nói một phút. –

+0

thư viện nào bạn đang sử dụng cho máy khách ftp? –

+0

Nếu viết bắt đầu sau khi bạn bắt đầu tải xuống thì sao? –

Trả lời

21

Đây là vấn đề rất cũ và nổi tiếng.

Không có cách nào để chắc chắn hoàn toàn một tệp được ghi bởi trình nền FTP hoàn tất. Nó thậm chí có thể là chuyển tập tin không thành công và sau đó được khởi động lại và hoàn thành. Bạn phải thăm dò ý kiến ​​kích thước của tệp và đặt giới hạn thời gian là 5 phút. Nếu kích thước không thay đổi trong suốt thời gian đó, bạn cho rằng tệp đã hoàn tất.

Nếu có thể, chương trình xử lý tệp sẽ có thể xử lý các tệp một phần.

Một giải pháp thay thế tốt hơn nhiều là rsync, mạnh mẽ hơn và mang tính quyết định hơn nhiều. Nó thậm chí có thể được cấu hình (thông qua tùy chọn dòng lệnh) để ghi dữ liệu ban đầu đến một vị trí tạm thời và di chuyển nó đến đường dẫn đích cuối cùng của nó sau khi hoàn thành thành công. Nếu tập tin tồn tại nơi bạn mong đợi nó, sau đó nó là theo định nghĩa hoàn thành.

+0

Thực ra tôi đã sử dụng ngưỡng 5 phút này, điều này là, tôi thực sự có thể sử dụng tính khả dụng của tệp nhanh hơn. Tuy nhiên tôi có thể quản lý để kiểm tra kích thước của tập tin hai lần trong vòng chưa đầy một phút để làm cho giải pháp của bạn làm việc cho tôi :) cảm ơn Jim. –

+0

Tôi tự hỏi không có cách nào để truy vấn hệ điều hành cho số lượng "ghi xử lý" mở trên một tệp? đặc biệt thông qua ftp? –

+0

Điều đó sẽ không phân biệt đối xử giữa chuyển giao không thành công và chuyển hoàn toàn. Sử dụng giao thức rsync thay thế nếu bạn có thể, nó thực hiện một công việc tốt hơn nhiều. –

0

Bạn có thể sử dụng thư viện Ftp từ Apache API chung get more information

boolean flag = retrieveFile(String remote, OutputStream local); 

cờ dòng đầu ra kiểm tra này có sẵn trong file hiện hành.

+1

@ Hossain, câu hỏi của ông không phải là thư viện nào để sử dụng, nhưng làm thế nào để đảm bảo ông không tải xuống các tệp không đầy đủ từ máy chủ, thư viện Apache FTP không bảo đảm với bạn rằng nó sẽ luôn tải xuống tệp hoàn chỉnh từ máy chủ. –

+0

@Mohammod dù sao tôi cũng sẽ xem xét FTPClient phổ biến của Apache, cảm ơn –

+0

@Mohammod Tôi đã kiểm tra tài liệu, có vẻ như cờ là đúng nếu quá trình truy xuất hoàn tất thành công, không có nghĩa là nó sẽ không tải xuống tệp đang vẫn ghi vào. Tôi có nghĩa là nó sẽ tải về tập tin nhiều như nó được viết. và nó sẽ trả về true nếu nó có thể tải xuống tập tin không hoàn chỉnh thành công :) đó là những gì tôi không nói về;) anyway nhờ –

7

Điều này căn bản hơn FTP: bạn có vấn đề tương tự khi đọc những tệp đó ngay cả khi chúng được tạo trên máy cục bộ.

Nếu bạn không thể sửa đổi quá trình viết, bạn sẽ cần phải nhảy qua một số vòng lặp. Không có gì tuyệt vời, nhưng một số thì an toàn hơn những thứ khác.

  • Tiếp tục đọc cho đến khi không có gì thay đổi đối với một số cửa sổ (có thể là một phút, như David Schwartz đề xuất). Bạn có thể tối ưu hóa điều này một chút bằng cách xem kích thước tệp.
  • Tìm hiểu xem các tệp có được viết theo trình tự tin cậy hay không. Khi bạn thấy tập tin N xuất hiện, bạn biết rằng tập tin N-1 đã sẵn sàng. (Giả sử rằng thư mục trống trước khi các tệp được viết, mặc dù bạn cũng có thể xem dấu thời gian.) Nhược điểm là logic của bạn sẽ bị hỏng nếu người viết thay đổi thứ tự hoặc bắt đầu viết song song.

Các giải pháp đáng tin cậy, an toàn yêu cầu cải thiện quy trình ghi.

  • Writer có thể ghi tệp vào vị trí ẩn hoặc tạm thời và chỉ hiển thị chúng khi tệp toàn bộ hoặc thư mục đã sẵn sàng, sử dụng liên kết tượng trưng hoặc tệp di chuyển hoặc chmod.
  • Writer tạo tệp đặc biệt (ví dụ: "./DONE") chỉ sau khi tất cả các tệp khác đã được viết và người đọc không đọc bất kỳ tệp nào cho đến khi tệp đó xuất hiện.
  • Tùy thuộc vào loại tệp, người viết có thể thêm một số loại bản ghi cuối dòng/tệp ở cuối tệp và người đọc có thể đảm bảo rằng nó có mặt.
+0

nhờ dbort, tôi tự hỏi không có một cách để truy vấn hệ điều hành cho số mở "viết -handles "trên một tập tin? đặc biệt thông qua ftp? –

12

Giải pháp có thể là tải lên tệp đầu tiên bằng tên tệp khác (ví dụ: thêm ".partial") và sau đó đổi tên tệp thành tên cuối cùng.

Nếu máy chủ tìm thấy tên cuối cùng thì quá trình tải lên đã hoàn tất.

Nếu bạn không thể kiểm soát quá trình tải lên thì điều bạn đang yêu cầu là không thể theo định nghĩa: việc tải lên tệp có thể dừng do sự cố mạng hoặc do quá trình gửi bị dừng vì bất kỳ lý do gì.

Điểm kết thúc nhận được sẽ chỉ là kết thúc của luồng đến; không có cách nào để đảm bảo rằng dữ liệu sẽ không được chuyển một phần.

Các cách giải quyết khác có thể kiểm tra điểm đánh dấu dữ liệu cuối cùng hoặc sử dụng yêu cầu đến máy chủ gửi để kiểm tra xem (trong giao diện của họ) quá trình chuyển đã hoàn tất.

+0

Thật đáng buồn là quá trình ghi chép nằm ngoài tầm kiểm soát của tôi và sẽ không hợp tác với tôi, vì vậy tôi tự mình làm điều này. –

+0

Tôi nghĩ rằng những gì bạn đang yêu cầu là không thể. Nếu máy chủ gửi bị tắt ở giữa quá trình chuyển và không bao giờ bật lại thì quá trình chuyển hoàn tất không? Không có cách nào để phát hiện điều đó từ trang web nhận. – 6502

+0

okay cảm ơn bạn anyway –