2

FTP クライアント (org.apache.commons.net.ftp.FTPClient) は、FTP がまだアップロードしている間に別のクライアントがファイルを消費 (削除/移動) するとハングアップします。ファイルをアップロードするコードは次のとおりです。

    ftpClient = getFTPConnection();
    BufferedInputStream buffIn = new BufferedInputStream(inputStream);
    byte[] buffer = new byte[8192];
    OutputStream os = ftpClient.storeFileStream(filename);
    int readCount = 0;
    while ((readCount = buffIn.read(buffer)) > 0) {
        os.write(buffer, 0, readCount);
    }

    os.close();
    buffIn.close();
    inputStream.close();

    ftpClient.completePendingCommand(); //!stuck here!
    ftpClient.rename(filename, "uploadRename.txt");
    ftpClient.logout();
    ftpClient.disconnect();

アップロード中にファイルが削除されると、os.write は作業を終了します (問題ありません)。この権利を理解した場合、2番目のコマンドを作成するには ftpClient.completePendingCommand() を実行する必要があります。削除することは解決策ではありません。ftpClient がハングする理由を知っている人はいますか? completePendingCommand が ftp から必要なものを取得できない場合、エラー メッセージまたはタイムアウトが発生することを期待しています。

ありがとう

4

1 に答える 1

0

あなたの状況を再現しようとしましたが、アップロード中にファイルを変更しようとすると、サーバーは 450 コードで応答し、ファイルの削除を許可しません。

ところで、Commons-net API のドキュメントはほとんど素っ気ないので、ftp.getReplyCode()メソッドを呼び出して、呼び出しの前に正確に何が起こっているかを調べることができcompletePendingCommand()ます。

次に、この表の応答コードを照合して、応答コードを「切り替える」方法を決定できます。

于 2013-07-09T13:42:47.670 に答える