使用Java查找SFTP最旧文件的文件大小和上次修改

我正在使用JSch从SFTP服务器获取文件,但我试图找到一种方法来只获取最旧的文件,并确保它当前没有被写入。 我想象自己这样做的方法是首先找到指定的远程文件夹中的哪个文件是最旧的。 然后我会检查文件大小,等待x秒(可能大约10秒,只是为了安全),然后再次检查。 如果文件大小没有改变,我下载文件并进行处理。 但是,我不知道该怎么做! 如果有人知道如何做到这一点,或者知道其他支持具有此内置function的SFTP(我知道Apache Commons,但只有FTPS),我们将不胜感激。

提前致谢。

事实certificate,这在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; } 

我没有直接回答你的问题,但听起来你想要做一些类似于可靠文件传输的事情。 这是网格计算中较大项目的一部分,现在显然是在这里组织的。 我不知道它是否包含安全function,或者您是否可以添加它们,但它是一个开源项目。

您可以使用支持SFTP的edtFTPj / PRO轻松完成此操作。

只需获取目录列表,然后按日期对列表进行排序。 如果最旧的日期不在最后几分钟,您可以下载。

计算远程服务器中的文件夹大小只需调用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; } 
Interesting Posts