2010-09-29 33 views
8

Cố gắng tạo một plugin đơn giản chỉ cần kết nối với một trang web ftp, tra cứu tệp mới nhất và sau đó tải tệp xuống. Tuy nhiên, nó không nhận được tập tin mới nhất.tải tệp mới nhất từ ​​ftp

Tôi đang sử dụng org.apache.commons.net.ftp.ftpclient cho mọi thứ.

Đây là mã của tôi

public static void main(String[] args) 
    { 
    FTPClient client = new FTPClient(); 
    try 
    { 
    client.connect(host); 
    client.login(user, pwd); 
    FTPFile[] files = client.listFiles(); 
    FTPFile lastFile = lastFileModified(files); 
    System.out.println(lastFile.getName()); 
    client.disconnect(); 
    } 
    catch(SocketException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    catch(IOException e) 
    { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

} 

public static FTPFile lastFileModified(FTPFile[] files) { 
    Date lastMod = files[0].getTimestamp().getTime(); 
    FTPFile choice = null; 
    for (FTPFile file : files) { 
      if (file.getTimestamp().getTime().after(lastMod)) { 
        choice = file; 
        lastMod = file.getTimestamp().getTime(); 
      } 
    } 
    return choice; 
} 

Nó nhận được danh sách các tập tin, và sau đó trở về một tập tin, nó chỉ không phải là tập tin mới nhất. Có cách nào khác để so sánh ngày sửa đổi tập tin bằng cách sử dụng FTPClient hoặc bất cứ ai có thể chỉ cho tôi một hướng về những gì tôi đang làm sai. Cảm ơn.

+0

Là getTImestamp() báo cáo giá trị chính xác cho tất cả các tệp? –

+0

có ............. – Ryan

Trả lời

7

Thay vì phương thức "lastFileModified" của bạn, tôi sẽ tạo một Trình so sánh. Nó sẽ dễ dàng hơn để viết các cách sắp xếp:

public class LastModifiedComparator implements Comparator<FTPFile> { 

    public int compare(FTPFile f1, FTPFile f2) { 
     return f1.getTimestamp().compareTo(f2.getTimeStamp()); 
    } 
} 

Sau đó, nhận được "cuối cùng" FTPFile là dễ dàng hơn nhiều:

public FTPFile getMaxLastModified(FTPFile[] ftpFiles) { 
    return Collections.max(Arrays.asList(ftpFiles), new LastModifiedComparator()); 
} 

Để quay trở lại vấn đề của bạn: "lastModified" dấu thời gian không được liên kết với thứ tự tải lên FTP. Khi bạn tải lên tệp qua giao thức FTP, dấu thời gian ban đầu của tệp có thể được giữ nguyên.

Vì vậy, nếu tệp1 lớn hơn tệp 2, phương thức của bạn sẽ luôn trả về tệp 2, ngay cả khi tệp 2 được tải lên trước tệp1 trên máy chủ FTP.

Tôi nghĩ rằng không thể xác định tệp được tải lên lần cuối. Thông tin này không được lưu trữ bởi giao thức FTP. Bạn chỉ có thể thực hiện việc đó nếu bạn quá tải phương thức "đặt" của ứng dụng khách FTP:

public void put(File file) { 
    // upload code 
    FTPFile ftpFile = getJustUploadedFile(file); 
    ftpFile.setTimestamp(new Calendar()); // Now! 
} 
+0

Vâng so sánh không hoạt động, tôi sẽ nghiên cứu ứng dụng khách FTP để xem điều gì đang làm, cảm ơn thông tin. – Ryan

+0

dấu thời gian ban đầu _may_ được giữ nguyên. –

+0

Đó là sự thật: nó phụ thuộc vào máy khách FTP. Tôi đã chỉnh sửa bài đăng của mình để bao gồm độ chính xác của bạn. Cảm ơn rất nhiều. –

0

tôi thấy chỉ có một sai lầm:

FTPFile choice = null; 

Nếu file đầu tiên là những tập tin sửa đổi mới nhất, sau đó phương pháp này sẽ quay trở lại null, gây ra một tiềm năng NullPointerException.

Thay đổi nó để

FTPFile choice = files[0]; 

và logic nên đúng.

Nếu nó vẫn không trả về tệp được mong đợi, thì rất có khả năng tệp được đề cập chỉ đơn giản là không có ngày sửa đổi được mong đợi cuối cùng. Thêm nội dung như thế này vào vòng lặp for trong phương thức:

System.out.println(file.getTimestamp().getTime() + " - " + file.getName()); 

Và nhìn kỹ hơn.

+1

Kết quả tương tự, thêm thời gian vào đầu ra của hệ thống cho thấy Thứ Tư ngày 29 tháng 9 15:28:00 EDT 2010, cùng lúc đó FTP hiển thị 9/29/2010 3:28:00 CH. Tệp mới nhất thực sự là 9/29/2010 7:23:00 CH và có khoảng 50 tệp ở giữa các ngày đó. – Ryan

+0

Vì vậy, bạn đang so sánh thời gian ở những nơi khác nhau (trong Java và trong một số công cụ quản lý FTP)? Bạn đã kiểm tra dấu thời gian của tất cả các tệp trong vòng lặp 'for (FTPFile file: files)' như được đề xuất trong câu trả lời của tôi chưa? Công cụ quản lý FTP có thể sử dụng múi giờ khác. – BalusC

+0

Điều này bắt đầu bởi tôi chỉ hiển thị tên tập tin để tôi có thể kiểm tra lại để xem đó là tập tin chính xác trước khi tôi tiếp tục bất cứ điều gì, thấp và nhìn thấy điều này xảy ra. Tất cả các lần đều đến trong cùng một mã. Trực quan khi bạn đầu ra thời gian và sau đó so sánh với những gì bạn nhìn thấy trực quan với các tập tin đó là cùng một lúc, chỉ là một trong thời gian quân sự, khác không phải là. Nhưng trong mã họ đều có cùng giá trị. – Ryan

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