Search code examples
javasftpfilesizelast-modifiedjsch

Finding file size and last modified of SFTP oldest file using Java


I'm using JSch to get files from an SFTP server, but I'm trying to figure out a way to only get the oldest file, and to make sure that it is not currently being written to. The way I imagine myself doing this is first finding which file in the specified remote folder is oldest. I would then check the file size, wait x seconds (probably about 10, just to be safe) and then check it again. If the file size has not changed, I download the file and process it. However, I have no idea how to do this! If anybody knows how to do this, or knows of something else that supports SFTP that has this built-in (I know Apache Commons does, but only does FTPS), it would be greatly appreciated.

Thanks in advance.


Solution

  • Turns out that this is entirely possible in JSch, the hardest part is simply finding the documentation. Code I used is below, hopefully somebody else will find it helpful! (I'm sure there are optimizations to be made, I know, I know. There are also variables that are defined elsewhere, but hopefully anybody that needs this will be able to figure them out!)

    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;
    }