2012-10-01 16 views
4

我试图找到一种跨平台的方式来可靠地告诉文件是否完成了复制(通过外部进程)。如何找出当前Java文件是否正在增长(与操作系统无关)

此前,OSX/Linux的我只是被检查

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

然后等待几秒钟,然后再检查它,看它是否已经改变。

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

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

+0

在任何操作系统上都没有这样的功能。你想做什么? –

+0

你可以请求外部进程发布标志文件,一旦它完成写入数据到信号完成?这就是我通常会这样做的原因,或者要求外部数据提供商在交换馈送时等这样做。 – amphibient

+0

您是否每次都创建一个新的文件对象?如果没有,请尝试一下,可能是您创建的File对象正在缓存上次修改时间。 – Brigham

回答

0

我最终在两个不同的点,在解决了这个通过计算文件(而不是长度)的校验和散列时间并检查它们是否已更改以确定文件是否仍在写入。

2

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

(编辑,以去除想法这已经是这个问题,使用lastModified的。)

+0

正如我的问题所述,File.lastModified似乎并没有改变整个Windows上的过程。 FileOutputStream在Windows上(而不是在基于Unix的系统上)抛出一个异常,所以我可以在其中使用一个特定于平台的方法,但我最好喜欢一个可以在任何地方工作的单一解决方案。 –

+0

@ThomShutt:Darn,我只看到了问题的'length()'部分。你真的可以附加到Unix上另一个进程正在写入的文件吗?这听起来很奇怪 - 但我想这取决于文件编写代码。 –

+0

有趣的是,这种方法适用于本地文件,但由于某种原因,我仍然能够锁定正在写入网络目录的文件。 –

相关问题