2010-09-29 28 views
8

Tratando de crear un plugin simple que simplemente se conecta a un sitio ftp, busca el último archivo y luego lo descarga. Sin embargo, no está obteniendo el último archivo.obtener el último archivo de ftp

Estoy usando el org.apache.commons.net.ftp.ftpclient para todo.

Aquí está mi código

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; 
} 

Se está haciendo la lista de archivos, y luego devolver un archivo, simplemente no es el archivo más reciente. ¿Hay alguna otra forma de comparar las fechas de modificación de archivos usando FTPClient o puede alguien señalarme en una dirección sobre lo que estoy haciendo mal. Gracias.

+0

Es getTimestamp() informar sobre los valores correctos para todos los archivos? –

+0

sí ............. – Ryan

Respuesta

7

En lugar de su método "lastFileModified", crearía un Comparador. Sería más fácil para escribir el método para ordenar:

public class LastModifiedComparator implements Comparator<FTPFile> { 

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

Entonces, conseguir el "último" FTPFile es mucho más fácil:

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

volver a su problema: la "lastModified" la marca de tiempo no está vinculada a la orden de carga de FTP. Cuando carga un archivo a través del protocolo FTP, se puede conservar la marca de tiempo original del archivo.

Por lo tanto, si el archivo1 es anterior al archivo2, su método siempre devolverá el archivo2, incluso si el archivo2 se carga antes del archivo1 en el servidor FTP.

Creo que es imposible determinar el último archivo cargado. Esta información no está almacenada por el protocolo FTP. Usted puede hacer eso sólo si se sobrecarga el método de "venta" de su cliente FTP:

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

Sí, el comparador tampoco funcionó, investigaré el cliente FTP para ver qué está haciendo, gracias por la información. – Ryan

+0

se conserva la marca de tiempo original _may_. –

+0

Es cierto: depende del cliente FTP. Edité mi publicación para incluir su precisión. Muchas gracias. –

0

veo un solo error:

FTPFile choice = null; 

Si el primer archivo fuese el último archivo modificado, entonces el método volvería null, causando un potencial NullPointerException.

cambiarlo a

FTPFile choice = files[0]; 

y la lógica deben estar en lo cierto.

Si aún no devuelve el archivo esperado, lo más probable es que el archivo en cuestión simplemente no tenga la fecha de última modificación esperada. Añadir algo similar al bucle for en el método:

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

Y mira más de cerca.

+1

Mismo resultado, agregando el tiempo en la salida del sistema muestra Wed Sep 29 15:28:00 EDT 2010, que es el mismo momento en que el FTP muestra 9/29/2010 3:28:00 PM El último archivo es en realidad el 29/09/2010 a las 7:23:00 PM y hay aproximadamente 50 archivos entre esas fechas. – Ryan

+0

Entonces, ¿está comparando los tiempos en diferentes lugares (en Java y en alguna herramienta de administrador de FTP)? ¿Revisó la marca de tiempo de todos los archivos dentro del bucle 'for (FTPFile file: files)' como se sugiere en mi respuesta? La herramienta del administrador de FTP puede utilizar una zona horaria diferente. – BalusC

+0

Esto comenzó cuando solo aparecía el nombre del archivo para poder comprobar que era el archivo correcto antes de continuar algo, bajo y he aquí que esto sucedió. Los tiempos vienen todos de la misma manera en el código. Visualmente cuando saca el tiempo y luego compara con lo que ve visualmente con el archivo, es el mismo momento, solo uno está en tiempo militar, el otro no. Pero en el código son todos los mismos valores. – Ryan

Cuestiones relacionadas