我正在使用JSch从SFTP服务器获取文件,但我试图想办法只获取最旧的文件,并确保它当前没有被写入。我想象自己这样做的方法是首先找到指定的远程文件夹中的哪个文件是最旧的。然后我会检查文件大小,等待x秒(可能大约10秒,只是为了安全),然后再次检查。如果文件大小没有改变,我下载文件并进行处理。但是,我不知道该怎么做!如果有人知道如何做到这一点,或者知道支持具有此内置功能的SFTP的其他内容(我知道Apache Commons有,但只有FTPS),我们将不胜感激。
提前致谢。
答案 0 :(得分:16)
事实证明,这在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 :(得分:1)
我对你的问题没有直接的答案,但听起来你想做类似于reliable file transfer的事情。这是网格计算中一个更大的项目的一部分,现在显然是有组织的here。我不知道它是否包含安全功能,或者您是否可以添加它们,但它是一个开源项目。
答案 2 :(得分:1)
您可以使用支持SFTP的edtFTPj/PRO轻松完成此操作。
只需获取目录列表,然后按日期对列表进行排序。如果最早的日期不在最后几分钟,您可以下载。
答案 3 :(得分:-3)
计算远程服务器中的文件夹大小
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;
}