gpt4 book ai didi

java - file.createNewFile() 创建最后修改时间早于实际创建时间的文件

转载 作者:太空狗 更新时间:2023-10-29 11:48:04 26 4
gpt4 key购买 nike

我正在使用 JPoller 来检测特定目录中文件的更改,但它缺少文件,因为它们最终的时间戳比实际创建时间早。这是我的测试方式:

public static void main(String [] files)
{
for (String file : files)
{
File f = new File(file);
if (f.exists())
{
System.err.println(file + " exists");
continue;
}

try
{
// find out the current time, I would hope to assume that the last-modified
// time on the file will definitely be later than this
System.out.println("-----------------------------------------");
long time = System.currentTimeMillis();

// create the file
System.out.println("Creating " + file + " at " + time);
f.createNewFile();

// let's see what the timestamp actually is (I've only seen it <time)
System.out.println(file + " was last modified at: " + f.lastModified());

// well, ok, what if I explicitly set it to time?
f.setLastModified(time);
System.out.println("Updated modified time on " + file + " to " + time + " with actual " + f.lastModified());
}
catch (IOException e)
{
System.err.println("Unable to create file");
}
}
}

这是我得到的输出:

-----------------------------------------
Creating test.7 at 1272324597956
test.7 was last modified at: 1272324597000
Updated modified time on test.7 to 1272324597956 with actual 1272324597000
-----------------------------------------
Creating test.8 at 1272324597957
test.8 was last modified at: 1272324597000
Updated modified time on test.8 to 1272324597957 with actual 1272324597000
-----------------------------------------
Creating test.9 at 1272324597957
test.9 was last modified at: 1272324597000
Updated modified time on test.9 to 1272324597957 with actual 1272324597000

结果是竞争条件:

  1. JPoller 记录最后一次检查的时间为 xyz...123
  2. 文件创建于 xyz...456
  3. 文件最后修改的时间戳实际上是 xyz...000
  4. JPoller 查找时间戳大于 xyz...123 的新/更新文件
  5. JPoller 忽略新添加的文件,因为 xyz...000 小于 xyz...123
  6. 我把头发拔了一会儿

我尝试深入研究代码,但 lastModified()createNewFile() 最终都解析为 native 调用,所以我只剩下很少的信息。

对于 test.9我损失了 957 毫秒。我可以期望什么样的准确性?我的结果会因操作系统或文件系统而异吗?建议的解决方法?

注意:我目前正在运行带有 XFS 文件系统的 Linux。我用 C 编写了一个快速程序,stat system callst_mtime 显示为 truncate(xyz...000/1000)

更新:我在带有 NTFS 的 Windows 7 上运行了与上面相同的程序,它确实保持了完整的毫秒精度。 MSDN link @mdma 提供了进一步的注释,即 FAT 文件系统对于以 10 毫秒分辨率创建是准确的,但对于访问仅准确到 2 秒。因此,这确实取决于操作系统。

最佳答案

文件系统不会精确地存储时间,而且通常不会以毫秒为单位,例如FAT 的创建时间分辨率为 2 秒,而 NTFS 最多可延迟更新上次访问时间一小时。 (详细信息在 MSDN 上。)虽然不是您的情况,但通常情况下,如果文件是在另一台计算机上创建的,也存在同步时钟的问题。

对于 JPoller 人员来说,这似乎是个问题,因为这是时间处理逻辑所在的位置。在修复之前,您可以通过手动将写入的每个文件的最后修改时间设置为实际时间 +4 秒来解决此问题 - +4 是一个任意值,应该大于您正在处理的文件系统的分辨率。当文件写入文件系统时,它们将向下舍入,但小于您添加的值。不漂亮,但它会起作用!

关于java - file.createNewFile() 创建最后修改时间早于实际创建时间的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2717936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com