Java写入Windows Server 2016时上次修改的文件未更新



我在Windows Server 2016上有一个Java 10应用程序,它使用Java.util.logging不断写入文件。在Windows文件资源管理器中,"上次修改"one_answers"大小"列不会更新。按[F5]不会更新详细信息。DOSDIR给出了同样的错误答案右键单击>"属性">"详细信息">会给出一个甚至不同(而且更老)的答案。

仅运行DOSTYPE或在文件的记事本中打开/关闭(不保存),似乎会导致文件资源管理器和DOSDIR更新。

我认为Java代码相对于flush()是正确的,因为Windows Server 2008上Java 8上的相同类会导致文件资源管理器更新。此外,当运行TYPE和记事本时,我也看到了与系统时钟匹配的带时间戳的记录,但早在"上次修改"之后。

因此,我认为Windows Server 2016出现了问题。你知道该检查什么吗?

所以我认为Windows Server 2016有问题。你知道该检查什么吗?

默认情况下,Windows设置为以这种方式工作。自文件时间戳未在2008年更新,但在2003年更新:

2003年,在资源管理器中打开日志文件文件夹,每次更新日志时,您都可以看到时间戳和文件大小的变化。

2008年,大多数时候,除非你以其他方式互动,否则不会有任何变化。。。

[snip]

是的,其中一些属性已在2008年禁用。例如,如果您希望查看/使用"上次访问"时间,则需要启用对此属性的跟踪。

您可以通过将HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate设置为0(此值为REG_DWORD)来启用此功能。

请注意,他可能会影响繁忙文件服务器上的磁盘IO性能!

因此更改了行为以提高性能。

来自性能调整Web服务器:

系统全局开关NtfsDisableLastAccessUpdate(REG_DWORD)1位于HKLM\system\CurrentControlSet\Control\FileSystem下,默认设置为1。此开关通过禁用最后一次文件或目录访问的日期和时间戳更新来减少磁盘I/O负载和延迟。Windows Server 2016、Windows Server 2012 R2、Windows Server 2012Windows Server 2008R2和Windows Server 2008的干净安装默认情况下启用此设置,您无需对其进行调整。早期版本的Windows未设置此密钥。如果您的服务器运行的是早期版本的Windows,或者已升级到Windows server 2016、Windows server 2012 R2、Windows server 2008 R2或Windows server 2008,则应启用此设置。

此设置似乎仍然可以在Windows Server 2016中使用。

我认为Java代码关于flush()是正确的,因为Windows Server 2008上Java 8上的相同类会导致文件资源管理器更新。同样当运行TYPE和Notepad时,我也看到了与系统时钟匹配的带时间戳的记录;最后修改";。

Flush与sync不同。FileHandler只是在每个记录发布后执行一次刷新。Windows未设置为强制将元数据写入文件系统。在未关闭文件的情况下修改文件时,来自文件的"修改日期"属性不会更新。:

2008年;最后修改的";日志文件上的字段不会更新,除非另一个程序试图打开文件或实用程序停止,即使按下F5刷新视图。

Explorer通过使用cmd提示符和";dir";我们发现文件的NTFS元数据在关闭文件句柄之前不会更新。

刷新FOLDER的信息只会进入NTFS缓存的(内存驻留)元数据,但明确查询文件会迫使磁盘I/O获取属性-这是Vista中引入的一项设计更改,旨在减少不必要的磁盘I/O,以提高性能

此规则有一些例外:

  • 在一些但不是全部情况下;dir文件名"足以刷新元数据
  • "特别的";文件夹可能会有不同的处理方式,例如用户配置文件,我们不希望有大量文件,而是希望能够依赖所提供的文件数据
  • 内核过滤器驱动程序可以改变行为;添加、删除或改变其他驱动程序的功能">

由于解决方法是让任何进程打开和关闭日志文件的句柄,因此编写了一个工具来实现这一点,并使用以下API获取文件信息:

  • 创建文件
  • 按句柄获取文件信息
  • CloseHandle

您可以尝试使用FileHandler创建的文件名打开FileInputStream。

仅在文件的记事本中运行DOS TYPE或打开/关闭(不保存),似乎会导致文件资源管理器和DOS DIR更新。

我发现的从外部进程更新元数据的唯一通用方法是使用文件资源管理器交互式选择文件:

explorer /select, c:testfile.txt

这很可能与记事本中发生的情况非常相似。

我喜欢你使用TYPE命令。您可以将其与nul一起使用来忽略输出。

type filename.log > NUL

使用元数据开关运行dir可能会强制更新元数据:

dir /A /R /Q filename.log > nul

最新更新