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

これは、SFTP をサポートするedtFTPj/PROを使用して簡単に実行できます。

ディレクトリのリストを取得し、リストを日付順に並べ替えるだけです。最も古い日付が過去数分以内にない場合は、ダウンロードできます。

于 2010-04-23T09:07:12.227 に答える
1

あなたの質問に対する直接的な回答はありませんが、信頼できるファイル転送に似たようなことをしたいようです。これは、明らかにここで組織化されているグリッド コンピューティングのより大きなプロジェクトの一部です。セキュリティ機能が含まれているかどうか、または追加できるかどうかはわかりませんが、オープン ソース プロジェクトです。

于 2010-04-14T21:55:29.133 に答える
-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 に答える