1

FTPClientを使用してリモートFTPサーバーからファイルをダウンロードしています。

ダウンロード後、ローカルファイルとリモートファイルのサイズが同じ場合は比較したいと思います。

ファイルがダウンロードされると、ダウンロードされたファイルのサイズはリモートサーバーのものとは異なります。

以下はコードスニペットです

FileOutputStream output = new FileOutputStream(localFile.getAbsolutePath());
        if( getFTPFileType()!=null ){
                            // set as binary  
            ftpClient.setFileType(getFTPFileType(), getFTPFileType());
            ftpClient.setFileTransferMode(getFTPFileType());
        }
        if( getLog().isDebugEnabled()){
            getLog().debug("FTP File Type "+getFTPFileType());
        }
        boolean success = ftpClient.retrieveFile(remoteFile.getName(), output);

Windows環境でダウンロードすると、正常に動作します。しかし、AIXサーバーにダウンロードすると、ファイルサイズに違いがあります。ダウンロードしたファイルを比較しましたが、内容は同じです。

ご意見をお聞かせください。

4

1 に答える 1

1

サイズのバイト数の違い〜=ファイル内の行数の場合、Windowsのキャリッジ制御文字が削除されているため、\rまたは^Mviに表示されているとおりです。

また、チェックサムが失敗するという意味で、内容は同じではありません。

編集:

ftp内:dirfilenameは次のようなものを返します

-rw-rw-rw-   1 user     group        1224 Mar  4 20:22 twrite.c

Javaクラスにそのコマンドを送信させる方法がわかりません。ドキュメントを確認してください。動作するようになったらdir、戻ってきた文字列をトークン化できます。5番目のフィールドは、リモート側のバイト数です。

fileAがリモートからローカルにダウンロードされた後のunixシェル(javaではUNIXスクリプトを実行できます)の使用例:

local_size=$(ls -l fileA | awk '{print $5}')
/usr/bin/ftp -n  <<EOF > ftp.log
open remote_nodename
user username password
cd /directory/to/files
dir fileA
bye
END
remote_size=$(grep 'fileA' ftp.log | awk '{print $5}')
[ $remote_size -eq $local_size ] && echo 'OK' || echo 'NOTOK'

これをJavaクラスでエミュレートできる場合は、それ以外の場合は、ランタイムexec()の使用法を示す次のようなものを使用する必要があります。

http://www.java-samples.com/showtutorial.php?tutorialid=8

繰り返しますが、vbeをクリアするために、ftpはリモート側でシェルスクリプトを実行しません。sshはそうします。

于 2012-12-15T03:00:48.083 に答える