我们正在构建一个基于windows的应用程序,它递归地遍历目录结构,查找符合某些标准的文件,然后对它们进行一些处理。为了决定是否处理一个特定的文件,我们必须打开该文件并读取其中的一些内容。
这种方法在原则上看起来很棒,但是一些测试应用程序早期版本的客户报告说,它改变了大量文件的最后访问时间(这并不奇怪,因为它实际上正在访问这些文件)。这对这些客户来说是一个问题,因为他们有基于文件最后访问时间的存档策略(例如,他们存档的文件在过去12个月内没有被访问过)。因为我们的应用程序被安排比存档"窗口"更频繁地运行,我们有效地防止了这些文件中的任何一个被存档。
我们尝试添加一些代码来保存每个文件在读取之前的最后访问时间,然后在读取之后将其写回来(我知道这很可怕),但这给另一个正在基于文件系统事务日志进行增量备份的客户带来了问题。我们对文件的最后访问时间的显式设置导致这些文件包含在每次增量备份中,即使它们实际上没有更改。
那么问题来了:在Windows环境中,我们是否有办法在不更新最后访问时间的情况下读取文件?
提前感谢!
编辑:尽管有"ntfs"标签,我们实际上不能依赖于文件系统是ntfs。我们的许多客户在网络上运行我们的应用程序,因此它可以是另一端的任何东西。
文档表明您可以这样做,尽管我自己从未尝试过。
为了在访问文件后保留文件的现有最后访问时间,在打开文件句柄后立即调用SetFileTime,该参数的FILETIME结构成员初始化为0xFFFFFFFF。
从Vista开始,NTFS默认不更新最后访问时间。要启用此功能,请参阅http://technet.microsoft.com/en-us/library/cc959914.aspx
启动NTFS事务并回滚是非常糟糕的,性能会很糟糕。
你也可以做
FSUTIL行为设置disablelastaccess 0
我不知道你的客户端最低要求是什么,但是你试过NTFS交易吗?在台式机上,第一个支持它的操作系统是Vista,在服务器上是Windows server 2008。但是,它可能值得一看。
启动NTFS事务,读取文件,回滚事务。简单!: -)。我实际上不知道如果它会回滚最后访问日期虽然。你必须亲自测试一下。
这是一个链接到MSDN杂志关于NTFS交易的文章,其中包括其他链接。http://msdn.microsoft.com/en-us/magazine/cc163388.aspx
希望能有所帮助。