【问题标题】:How to find out whether a file is currently growing in Java (OS Independent)如何找出文件当前是否在 Java 中增长(独立于操作系统)
【发布时间】:2012-09-22 13:10:54
【问题描述】:

我正在尝试找到一种跨平台的方法来可靠地判断文件是否已完成复制(通过外部进程)。

以前,我只是在 OSX/Linux 上检查

File file = new File("path/to/file");
file.length()

然后等待几秒钟并再次检查它是否已更改。

但是,这在 Windows 上不起作用,因为该方法总是返回完整文件的大小(即它最终将被复制一次的大小)。

我也试过检查 lastModified 时间戳,但这似乎也没有改变。

【问题讨论】:

  • 任何操作系统都没有这样的功能。你想做什么?
  • 您能否要求外部进程在完成将数据写入其中以表示完成后发布标志文件?这就是我在交换提要等时通常会这样做或要求外部数据提供者这样做的方式
  • 你每次都创建一个新的文件对象吗?如果没有,请尝试,您正在创建的 File 对象可能正在缓存上次修改时间。
  • @foampile 不幸的是,外部过程完全超出了我们的控制和改变的能力
  • @Brigham 不幸的是没有帮助 - file.length 将在 Windows 上返回完整大小,无论何时创建 File 对象

标签: java windows file filesystems


【解决方案1】:

一种选择是尝试打开文件进行写入,使用“附加”FileOutputStream - 如果你能做到这一点,那么另一个进程不太可能在写入文件。当然,您不需要写入任何数据 - 只需创建流即可。

(已编辑以删除问题中已经存在的想法,即使用lastModified。)

【讨论】:

  • 正如我的问题中所述, File.lastModified 在 Windows 的整个过程中似乎没有改变。 FileOutputStream 确实会在 Windows 上引发异常(而不是在基于 Unix 的系统上),因此我可以在其中使用一个特定于平台的方法,但理想情况下,我希望有一个适用于任何地方的单一解决方案。
  • @ThomShutt:该死,我只看到了问题的length() 部分。您真的可以附加到由 Unix 上的另一个进程写入的文件吗?这听起来很奇怪 - 但我想这取决于文件编写代码。
  • 有趣的是,这种方法适用于本地文件,但由于某种原因,我仍然能够锁定正在写入网络目录的文件。
【解决方案2】:

我最终通过在两个不同的时间点计算文件的校验和和哈希(而不是长度)并检查它们是否发生变化以确定文件是否仍在被写入来解决这个问题。

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 2013-06-14
    • 1970-01-01
    • 2010-09-14
    • 2017-07-19
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多