5

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

这种方法原则上看起来不错,但一些测试该应用程序早期版本的客户报告说,它正在更改大量文件的最后访问时间(不足为奇,因为它实际上正在访问文件)。这对这些客户来说是个问题,因为他们有基于文件最后访问时间的归档策略(例如,他们归档过去 12 个月内未访问的文件)。因为我们的应用程序比归档“窗口”更频繁地运行,所以我们有效地防止了这些文件中的任何一个被归档。

我们尝试在读取每个文件之前添加一些代码来保存每个文件的最后访问时间,然后再将其写回(我知道这很可怕),但这给另一个基于文件系统事务日志进行增量备份的客户带来了问题。我们对文件的最后访问时间的显式设置导致这些文件包含在每个增量备份中,即使它们实际上并没有改变。

那么问题来了:在 Windows 环境中,有什么方法可以让我们在不更新上次访问时间的情况下读取文件?

提前致谢!

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

4

3 回答 3

6

文档表明您可以做到这一点,尽管我自己从未尝试过。

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

于 2011-04-14T13:26:04.723 回答
4

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

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

你也可以做

FSUTIL 行为集 disablelastaccess 0

于 2011-04-27T01:58:48.800 回答
1

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

启动 NTFS 事务,读取文件,回滚事务。简单的!:-)。我实际上不知道它是否会回滚上次访问日期。您将不得不自己测试它。

这是 MSDN 杂志关于 NTFS 事务的文章的链接,其中包括其他链接。http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

希望能帮助到你。

于 2011-04-14T13:27:20.367 回答