所以我假设 Windows Server 2016 有问题。您知道要检查什么吗?
默认情况下,Windows 设置为以这种方式工作。从文件时间戳未在 2008 年更新,但在 2003 年更新 https://social.technet.microsoft.com/Forums/windowsserver/en-US/2b8baca2-9c1b-4d80-80ed-87a3d6b1336f/file-timestamp-not-updating-on-2008-but-does-on-2003?forum=winservergen:
2003年,在资源管理器中打开日志文件夹,您可以看到每次更新日志时时间戳和文件大小都在眼前发生变化。
在 2008 年,大多数时候,除非你以其他方式互动,否则不会有任何变化......
[snip]
是的,其中一些属性已于 2008 年被禁用。
例如,如果您想要查看/使用“上次访问”时间,则需要启用此属性的跟踪。
您可以通过将 HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate 设置为 0(该值为 REG_DWORD)来启用此功能。
请注意,他可能会影响繁忙文件服务器上的磁盘 IO 性能!
因此,改变行为是为了提高绩效。
来自Web 服务器性能调优 https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/role/web-server/:
系统全局开关 NtfsDisableLastAccessUpdate (REG_DWORD) 1 位于 HKLM\System\CurrentControlSet\Control\FileSystem 下,默认设置为 1。此开关通过禁用上次的日期和时间戳更新来减少磁盘 I/O 负载和延迟。文件或目录访问。 Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows Server 2008 R2 和 Windows Server 2008 的全新安装默认启用此设置,您无需调整它。早期版本的 Windows 没有设置此键。如果您的服务器运行的是早期版本的 Windows,或者已升级到 Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows Server 2008 R2 或 Windows Server 2008,则应启用此设置。
看来这个设置在 Windows Server 2016 中仍然可以使用。
我假设 Java 代码对于 flash() 是正确的,因为 Windows Server 2008 上的 Java 8 上的相同类会导致文件资源管理器更新。此外,在运行 TYPE 和记事本时,我还看到与系统时钟匹配的时间戳记录,但在“上次修改”之后。
刷新与同步不同 https://stackoverflow.com/questions/4072878/i-o-concept-flush-vs-sync. The FileHandler
仅在发布每条记录后执行刷新。 Windows 未设置为强制将元数据写入文件系统。从在修改文件而不关闭文件时,文件“修改日期”属性不会更新。 https://blogs.technet.microsoft.com/asiasupp/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file-without-closing-it/:
在 2008 年,日志文件上的“上次修改”字段不会更新,除非另一个
程序尝试打开文件或实用程序被停止,即使按 F5
刷新视图。
资源管理器从 NTFS 获取信息,通过使用 cmd 提示符和“dir”,我们发现文件的 NTFS 元数据在文件句柄关闭之前不会更新。
刷新文件夹的信息只是转到 NTFS 缓存的(驻留在内存中的)元数据,但显式查询文件将强制磁盘 I/O 获取属性 - 这是 Vista 中引入的设计更改,以减少不必要的磁盘I/O 以提高性能
此规则有一些例外:
- 在某些情况下(但不是全部),简单的“dir 文件名”足以刷新元数据
- “特殊”文件夹可能会受到不同的对待,例如我们不希望有大量文件但希望能够依赖所提供的文件数据的用户配置文件
- 内核过滤器驱动程序可能会改变行为,因为根据设计它们“添加、删除或
更改其他驱动程序的功能”
由于解决方法是让任何进程打开和关闭日志文件的句柄,因此编写了一个工具来完成此操作,并使用以下 API 获取文件信息:
您可以尝试使用 FileHandler 创建的文件名打开 FileInputStream。
仅在文件上运行 DOS TYPE 或在记事本中打开/关闭(不保存),似乎会导致文件资源管理器和 DOS DIR 更新。
我发现从外部进程更新元数据的唯一通用方法是使用文件资源管理器选择文件 https://superuser.com/questions/1206477/open-explorer-with-file-selected-if-not-open-already交互方式:
explorer /select, c:\test\file.txt
这很可能与记事本中发生的情况非常相似。
我喜欢你使用TYPE https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/type命令。您可以将其与nul https://stackoverflow.com/questions/313111/is-there-a-dev-null-on-windows忽略输出。
type filename.log > NUL
运行时有可能dir https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dir使用元数据开关可能会强制更新元数据:
dir /A /R /Q filename.log > nul