Domanda

sto usando JSch per ottenere i file da un server SFTP, ma sto cercando di capire un modo per ottenere solo il file più vecchio, e per assicurarsi che non è attualmente in fase di scrittura. Il modo in cui mi immagino fare questo è il primo risultato, che file nella cartella remota specificata è la più antica. Vorrei quindi controllare la dimensione del file, attendere x secondi (probabilmente circa 10, giusto per essere sicuri) e quindi controllare di nuovo. Se la dimensione del file non è cambiato, ho scaricato il file ed elaborarlo. Tuttavia, non ho idea di come fare questo! Se qualcuno sa come fare questo, o è a conoscenza di qualcosa d'altro che supporti SFTP che ha questo built-in (lo so Apache Commons fa, ma solo non FTPS), sarebbe molto apprezzato.

Grazie in anticipo.

È stato utile?

Soluzione

Si scopre che questo è del tutto possibile in JSch, la parte più difficile è semplicemente trovare la documentazione. Codice che ho usato è al di sotto, si spera che qualcun altro lo troverà utile! (Sono sicuro che ci sono ottimizzazioni da fare, lo so, lo so. Ci sono anche le variabili che sono definite altrove, ma si spera qualcuno che ha bisogno di questo sarà in grado di capire fuori!)

public static String oldestFile() {
    Vector list = null;
    int currentOldestTime;
    int nextTime = 2140000000; //Made very big for future-proofing
    ChannelSftp.LsEntry lsEntry = null;
    SftpATTRS attrs = null;
    String nextName = null;
    try {
        list = Main.chanSftp.ls("*.xml");
        if (list.isEmpty()) {
            fileFound = false;
        }
        else {
            lsEntry = (ChannelSftp.LsEntry) list.firstElement();
            oldestFile = lsEntry.getFilename();
            attrs = lsEntry.getAttrs();
            currentOldestTime = attrs.getMTime();
            for (Object sftpFile : list) {
                lsEntry = (ChannelSftp.LsEntry) sftpFile;
                nextName = lsEntry.getFilename();
                attrs = lsEntry.getAttrs();
                nextTime = attrs.getMTime();
                if (nextTime < currentOldestTime) {
                    oldestFile = nextName;
                    currentOldestTime = nextTime;
                }
            }
            attrs = chanSftp.lstat(Main.oldestFile);
            long size1 = attrs.getSize();
            System.out.println("-Ensuring file is not being written to (waiting 1 minute)");
            Thread.sleep(60000); //Wait a minute to make sure the file size isn't changing
            attrs = chanSftp.lstat(Main.oldestFile);
            long size2 = attrs.getSize();
            if (size1 == size2) {
                System.out.println("-It isn't.");
                fileFound = true;
            }
            else {
                System.out.println("-It is.");
                fileFound = false;
            }
        }
    } catch (Exception ex) {ex.printStackTrace();}
    return Main.oldestFile;
}

Altri suggerimenti

Si può facilmente farlo usando edtFTPj / PRO , che supporta SFTP .

È sufficiente ottenere l'elenco di una directory, e ordinare l'elenco in base alla data. Se la data più antica non è negli ultimi minuti, è possibile scaricare.

Non ho una risposta diretta alla tua domanda, ma suona come si vuole fare qualcosa di simile a affidabile di trasferimento file . Questo fa parte di un più ampio progetto di grid computing che è ora a quanto pare organizzato qui . Non so se si include funzionalità di sicurezza o se è possibile aggiungere, ma è un progetto open source.

calcolare la dimensione delle cartelle in un server remoto basta chiamare il percorso della directory ftpFolderSize(ftpFolderSize,client), e passare il FTPClient oggetto come parametro. Esso restituirà il dimensione della cartella.

funziona solo per FTP.

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.io.FileUtils;

long dirSize = 0L; //global variable

private long ftpFolderSize(String directoryPath,FTPClient client){

    try{
        client.changeWorkingDirectory(directoryPath); 
        FTPFile[] ftpFiles = client.listFiles();
        if(client.changeWorkingDirectory(directoryPath))
        {
            for (FTPFile ftpFile : ftpFiles) {
                if(ftpFile.isFile()){
                    dirSize = dirSize+ftpFile.getSize();// file size is calculated
                }
                else if(ftpFile.isDirectory())
                {
                    dirSize = dirSize + 4096;//folder minimum size is 4kb
                    ftpFolderSize(directoryPath+"/"+ftpFile.getName(),client);
                }

            }
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return dirSize;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top