【问题标题】:Linux + Java + Windows : Check if file copied completelyLinux + Java + Windows:检查文件是否完全复制
【发布时间】:2017-04-29 09:16:31
【问题描述】:

我有一个 Java 应用程序,它监视目录中的新文件并处理它在目录中看到的任何新文件。 应用程序需要在 linux 和 windows env 上运行。问题出在 linux 上,当用户手动复制目录中的文件时,应用程序会在文件完全复制之前选择文件到目录中。 我尝试使用各种方法锁定文件,但即使文件仍在被 linux 系统复制,应用程序也能够获取文件的锁定。我也考虑过使用 lsof 命令检查文件,但它是特定于 linux 的,所以我试图避免这种情况。


有人可以建议一种方法来防止应用程序拾取不完整的文件吗? 提前致谢。

【问题讨论】:

  • 解决此问题的一种方法是始终将两个文件复制到目标文件夹中。首先,您将实际数据文件复制到目标文件夹中,让我们将该文件称为“fileName.dat”。一旦此文件复制成功完成,您将在目标文件夹中创建一个名为“fileName.done”的虚拟文件。您的应用程序检测到以“.done”结尾的文件,并且知道有一个“fileName.dat”可供读取。
  • 如果我们可以控制谁在复制目录中的文件,这将是有意义的,不幸的是我们不知道谁将复制文件以及如何引导他们。
  • 在其大小稳定五分钟或您认为合适的任何时间之前不要使用它。
  • 我相信您可以在文件仍在写入的同时读取文件。为什么不尝试这种方法?
  • @Hector 因为你不知道文件结尾是临时的还是永久的。

标签: java linux file-copying fileobserver


【解决方案1】:

您可以每隔 2 秒检查文件大小,如果不同,则正在复制文件,否则您可以继续:)

【讨论】:

    【解决方案2】:

    也许解决方案是来自this 帖子的答案。你可以试试jpoller

    【讨论】:

      【解决方案3】:

      您可以实现此目的的一种方法是,当您的程序检测到目录中存在新文件时,它可以将该文件添加到列表中,并使用以下方法定期检查列表中每个元素的文件大小:

      文件#长度

      如果在一定时间后文件大小没有改变,那么理论上文件应该被完全复制并刷新到目录中。

      【讨论】:

      • 感谢回复,我也考虑过这个,但似乎不是一个很干净的解决方案。您还有什么建议吗?
      • 另一种可能的解决方案是让您的程序递归搜索原始文件并使用复制的文件检查其文件大小。您只需搜索一次,然后就可以将其绝对路径缓存在程序中的某个位置。
      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多