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

问题描述 投票:0回答:4

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

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

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

所以问题是:在 Windows 环境中,有什么方法可以读取文件而不更新上次访问时间?

提前致谢!

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

windows ntfs lastaccesstime
4个回答
6
投票

文档表明您可以执行此操作,尽管我自己从未尝试过。

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


4
投票

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

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

你也可以做

FSUTIL行为设置disablelastaccess 0


1
投票

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

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

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

希望有帮助。


0
投票

您还可以在将更改 LastAccessTime 的代码之前使用方法 File.GetLastAccessTime(fileInfoLocation);,然后在要更改 LastAccessTime 的代码之后,您可以使用方法 File.SetLastAccessTime(fileInfoLocation, originalLastAccessTime) ); 将其设置回原来的状态,但如果您想将其更改为原始 AKA 以管理员身份运行,则需要 SetLastAccessTime 部分的管理权限。 这里有一些代码例如:

FileInfo fileInfoLocation = new FileInfo(getAllExeLocation[l]);
                                                DateTime originalLastAccessTime = File.GetLastAccessTime(fileInfoLocation.FullName);//Save the LastAccessTime before it was changed by Icon.Extract Method
                                                exeIcon = Icon.ExtractAssociatedIcon(fileInfoLocation.FullName);//This changes LastAccessTime
                                                File.SetLastAccessTime(fileInfoLocation.FullName, originalLastAccessTime);//Set the LastAccessTime to the originalOne though it needs Privileges to do this one(run as admin) or Use Try-Catch statement
© www.soinside.com 2019 - 2024. All rights reserved.