5

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

提前致谢。

4

4 回答 4

21

事实证明,这在 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;
}
于 2010-04-29T22:05:32.907 回答
1

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

于 2010-04-14T21:55:29.133 回答
1

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

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

于 2010-04-23T09:07:12.227 回答
-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;
}
于 2011-09-28T10:50:06.620 回答