在读取文件时,请避免更新上次访问的日期/时间

时间:2011-04-14 13:11:09

标签: windows ntfs lastaccesstime

我们正在构建一个基于Windows的应用程序,该应用程序以递归方式遍历目录结构,查找符合特定条件的文件,然后对它们进行一些处理。为了决定是否处理特定文件,我们必须打开该文件并阅读其中的一些内容。

这个方法似乎在原则上很大,但一些客户测试应用程序的早期版本已经报告说,它正在改变大量的文件的最后访问时间(这并不奇怪,因为它实际上是在访问文件)。这对于这些客户来说是一个问题,因为他们具有基于上次访问文件时间的存档策略(例如,他们存档过去12个月内未访问过的文件)。由于我们的应用程序计划比存档“窗口”更频繁地运行,因此我们有效地阻止了这些文件的任何存档。

我们尝试添加一些代码,阅读它之前,每个文件的最后访问时间保存,然后将它写回之后(丑陋的,我知道),但造成的问题,为其他客户谁是基于文件系统的事务日志进行增量备份。我们对文件上次访问时间的显式设置导致这些文件包含在每个增量备份中,即使它们实际上没有更改。

所以这里的问题:有没有在Windows环境中不得以任何方式,我们可以读取文件没有最后访问时间更新

提前致谢!

编辑:尽管有“ntfs”标签,但我们实际上不能依赖于NTFS文件系统。我们的许多客户通过网络运行我们的应用程序,因此它可能只是另一端的任何东西。

3 个答案:

答案 0 :(得分:5)

documentation表示你可以这样做,虽然我自己从未尝试过。

  

要在访问文件后保留文件的现有上次访问时间,请在打开文件句柄后立即调用SetFileTime,并将此参数的FILETIME结构成员初始化为0xFFFFFFFF。

答案 1 :(得分:4)

从Vista开始,NTFS默认情况下不会更新上次访问时间。要启用此功能,请参阅http://technet.microsoft.com/en-us/library/cc959914.aspx

启动NTFS事务并回滚非常糟糕,性能会很糟糕。

您也可以

FSUTIL行为设置disablelastaccess 0

答案 2 :(得分:1)

我不知道您的客户最低要求是什么,但您尝试过NTFS交易吗?在桌面上,支持它的第一个操作系统是Vista,在服务器上它是Windows Server 2008.但是,它可能值得一看。

启动NTFS事务,读取文件,回滚事务。简单! :-)。我实际上不知道是否会回滚上次访问日期。你必须自己测试一下。

以下是有关NTFS交易的MSDN杂志文章的链接,其中包含其他链接。 http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

希望它有所帮助。