Поиск размера файла и последнего изменения самого старого файла SFTP с использованием Java
Я использую JSch для получения файлов с SFTP-сервера, но я пытаюсь найти способ получить только самый старый файл и убедиться, что он в данный момент не записывается. То, как я себе это представляю, - это сначала найти, какой файл в указанной удаленной папке самый старый. Затем я проверил бы размер файла, подождал х секунд (вероятно, около 10, просто для безопасности), а затем проверил его снова. Если размер файла не изменился, я загружаю файл и обрабатываю его. Тем не менее, я понятия не имею, как это сделать! Если кто-нибудь знает, как это сделать, или знает что-то еще, поддерживающее SFTP, который имеет эту встроенную функцию (я знаю, что Apache Commons поддерживает, но использует только FTPS), это было бы очень полезно.
Заранее спасибо.
4 ответа
Оказывается, это вполне возможно в 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;
}
Вы можете легко сделать это, используя edtFTPj / PRO, который поддерживает SFTP.
Просто получите список каталогов и отсортируйте список по дате. Если самая старая дата не в последние несколько минут, вы можете скачать.
У меня нет прямого ответа на ваш вопрос, но похоже, что вы хотите сделать что-то похожее на надежную передачу файлов. Это часть более крупного проекта в области Grid-вычислений, который теперь, очевидно, организован здесь. Я не знаю, включает ли он функции безопасности или вы можете добавить их, но это проект с открытым исходным кодом.
Рассчитать размер папки на удаленном сервере просто позвоните 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;
}