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或者^M它们出现在 vi 中。

在校验和失败的意义上,内容是不一样的。

编辑:

inside ftp: dir filename 将返回类似这样的内容

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

我不知道如何让您的 java 类发送该命令。检查您的文档。当您可以开始dir工作时,您可以标记您返回的字符串,第五个字段是远程端的字节数。

在将 fileA 从远程下载到本地后,使用 unix shell 的示例(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

同样,要明确 ftp 不在远程端运行 shell 脚本。ssh 可以。

于 2012-12-15T03:00:48.083 回答