【问题标题】:FileUtils.copyFile fails for large filesFileUtils.copyFile 对大文件失败
【发布时间】:2013-08-27 13:36:15
【问题描述】:

我有一个简单的 Java 应用程序正在尝试跨 WAN(从爱尔兰到纽约)复制文件。

我最近修改它以使用FileUtils,因为本机 Java 文件复制太慢了。我研究发现因为Fileutils使用NIO更好。文件复制现在效果很好,但有时我需要复制非常大的文件(> 200Mb),复制失败并出现错误:

java.io.IOException: Failed to copy full contents from...

我知道这个错误意味着目标文件大小与源文件大小不同,所以最初我认为是网络问题。该过程每隔几个小时反复尝试复制文件,但从未成功。但是,当我通过 Windows 资源管理器手动复制文件时,它工作正常。这似乎排除了网络......但我不太确定。

我已搜索但找不到任何具有完全相同问题的帖子。任何帮助将不胜感激。

谢谢!

补充:
我正在使用这个 FileUtils 方法:

public static void copyFile(java.io.File srcFile, java.io.File destFile) throws java.io.IOException

【问题讨论】:

  • FileUtils 中有许多方法称为copyFile。如果您添加一些代码以准确显示您在做什么,我们可以提供更多帮助。
  • 嗨,我看到了你提到的帖子,但这与文件锁定有关。每次我复制文件时,它都有一个唯一的名称,所以我没有这个问题。
  • 文件是否可能在您复制时发生变化?您使用的是什么版本的 Apache IO?
  • 嗨,我正在使用 Commons IO 2.4。不,文件一旦创建就不会更改。应用程序创建文件,用时间戳命名,然后尝试复制它。它每 2 小时运行一次,因此下次它会有一个新的文件名。另请注意,较小的文件没有问题。这仅在进程碰巧创建大文件时偶尔发生。谢谢!

标签: java large-files ioerror fileutils


【解决方案1】:

所以我发现问题出在目标文件夹上。有一个轮询过程假设在文件被复制后拾取文件。但是,该文件在复制完成之前已被移动。这可能不会在 Windows 驱动器上发生,因为该文件将被锁定(我在本地测试并且在文件复制时无法删除)。但是,目标文件夹是已安装的 celerra 共享。引擎盖下的 unix 进程是抓取文件的原因......我想它并不关心某些 Windows 进程是否仍在写入它。

感谢您抽出时间 medPhys-pl!

【讨论】:

  • 我知道这个问题现在已经有 6 年多了,但我很好奇你做了什么——改变轮询行为(这似乎不太可能)还是什么?
  • 我忘了这个!是的,我最终删除了一个单独的文件作为标志,轮询过程在扫描目录之前等待它。
  • 啊。不幸的是,就我而言,我没有轮询器的所有权。太糟糕了。
猜你喜欢
  • 2013-03-26
  • 2012-05-31
  • 2011-05-04
  • 2011-11-15
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2012-10-12
  • 2012-04-12
相关资源
最近更新 更多