Поиск размера файла и последнего изменения самого старого файла SFTP с использованием Java - PullRequest
2 голосов
/ 15 апреля 2010

Я использую JSch для получения файлов с SFTP-сервера, но я пытаюсь найти способ получить только самый старый файл и убедиться, что он в данный момент не записывается.То, как я себе это представляю, это сначала найти, какой файл в указанной удаленной папке самый старый.Затем я проверил бы размер файла, подождал х секунд (вероятно, около 10, просто для безопасности), а затем проверил его снова.Если размер файла не изменился, я загружаю файл и обрабатываю его.Тем не менее, я понятия не имею, как это сделать!Если кто-то знает, как это сделать, или знает что-то еще, поддерживающее SFTP, который имеет эту встроенную функцию (я знаю, что Apache Commons поддерживает, но поддерживает только FTPS), это было бы очень полезно..

Ответы [ 4 ]

16 голосов
/ 30 апреля 2010

Оказывается, это вполне возможно в JSch, самое сложное - просто найти документацию. Код, который я использовал ниже, надеюсь, кто-то найдет его полезным! (Я уверен, что необходимо провести оптимизацию, я знаю, я знаю. Есть также переменные, которые определены в другом месте, но, надеюсь, любой, кто нуждается в этом, сможет их выяснить!)

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;
}
1 голос
/ 23 апреля 2010

Вы можете легко сделать это, используя edtFTPj / PRO , который поддерживает SFTP.

Просто получите список каталогов и отсортируйте список по дате.Если самая старая дата не в последние несколько минут, вы можете скачать.

1 голос
/ 15 апреля 2010

У меня нет прямого ответа на ваш вопрос, но похоже, что вы хотите сделать что-то похожее на надежную передачу файлов .Это часть более крупного проекта в области Grid-вычислений, который теперь, по-видимому, организован здесь .Я не знаю, включает ли он функции безопасности или вы можете добавить их, но это проект с открытым исходным кодом.

0 голосов
/ 28 сентября 2011

рассчитать размер папки на удаленном сервере просто позвонив путь к каталогу ftpFolderSize(ftpFolderSize,client) и передать объект FTPClient в качестве параметра. Это вернет размер папки.

Работает только для 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;
}
...