在更改/覆盖文件时从ftp服务器下载文件

时间:2012-07-30 14:11:39

标签: java ftp stream

我们正在从FTP服务器下载文件。文件内容有时会发生变化。文件名始终相同。

这种情况可能吗?

  1. 文件内容为“aaaaaaaaaaaaa”
  2. 我们开始下载
  3. 文件被覆盖,看起来像“bbbbbbbbbbbbb”
  4. 我们得到的文件内容是“aaaaabbbbbbb”
  5. 用于下载的库是apache commons-net。

    使用的代码是:

    FTPClient ftpClient = new FTPClient();
    //client connecting code...
    //...
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ftpClient.retrieveFile(path, outputStream);
    outputStream.writeTo(new FileOutputStream(new File("myFile.txt")));
    

3 个答案:

答案 0 :(得分:2)

这实际上可能发生。所以我建议你在下载之前获得文件的校验和。 (使用FTP站点命令在服务器上执行脚本以提供校验和),然后在下载后,与下载文件的校验和进行比较。

答案 1 :(得分:0)

是的,这种情况是可能的,具体取决于FTP服务器的实现方式,以及如何将文件写入其正在服务的区域。

您无法在FTP客户端/协议级别处理此问题。

但是您可以通过让服务器端应用程序生成并写入更新文件的校验和或散列并将其写入FTP区域来在应用程序级别解决它。然后,客户端可以读取数据文件和校验和文件,并检查数据文件的校验和是否正确。如果它们不匹配,则补救措施是再次获取这两个文件。

答案 2 :(得分:0)

如果您使用的是unix服务器,则文件在下载过程中不应更改。连接中断后,您无法对更改进行任何操作。但是要不更改正在下载的文件,您应该将进程上载或创建文件更改为FTP服务器。首先将文件上传到临时文件名。我在bash中使用$ RANDOM,这并不重要,.tmp后缀就足够了,只要在同一个目录中不存在同名域名.tmp作为合法文件。然后做mv tempname.tmp同名。 Move是在unix服务器上的原子操作。这意味着启动的用户将继续下载原始文件。移动后将打开文件的用户将开始下载新文件。当FTP服务器打开的所有句柄都关闭时,内核将删除旧文件。