Directory.GetFiles保留上次访问时间

看来C#中的Directory.GetFiles()修改了文件的上次访问日期。 我用谷歌搜索了几个小时,似乎无法找到解决这个问题的方法。 反正是否保留文件的所有MAC(已修改,已访问,已创建)属性? 我正在使用Directory.GetDirectories(),Directory.GetFiles()和FileInfo。

此外,fi.LastAccessTime给出了奇怪的结果 – 日期是正确的,但是,时间是2分钟或几个小时。

Time of function execution: 10/31/2008 8:35 AM Program Shows As Last Access Time 0_PDFIndex.html - 10/31/2008 8:17:24 AM AdvancedArithmetic.pdf - 10/31/2008 8:31:05 AM AdvancedControlStructures.pdf - 10/30/2008 1:18:00 PM AoAIX.pdf - 10/30/2008 1:18:00 PM AoATOC.pdf - 10/30/2008 12:29:51 PM AoATOC2.pdf - 10/30/2008 1:18:00 PM Actual Last Access Time 0_PDFIndex.html - 10/31/2008 8:17 AM AdvancedArithmetic.pdf - 10/30/2008 12:29 PM AdvancedControlStructures.pdf - 10/30/2008 12:29 PM AoAIX.pdf - 10/30/2008 12:29 PM AoATOC.pdf - 10/30/2008 12:29 PM AoATOC2.pdf - 10/30/2008 12:29 PM 

以下是我正在使用的方法。 如果您需要更多信息,请告诉我。

谢谢!

 public void PopulateTreeView(string directoryValue, ref TreeNode parentNode) { string[] directoryArray = Directory.GetDirectories(directoryValue); string[] fileArray = Directory.GetFiles(directoryValue, "*.*", SearchOption.AllDirectories); try { #region Directories if (directoryArray.Length != 0) { foreach (string directory in directoryArray) { DirectoryInfo di = new DirectoryInfo(directory); TreeNode dirNode = parentNode.Nodes.Add(di.Name); FileNode fn = new FileNode(); fn.bIsDir = true; fn.dir = di; dirNode.Tag = fn; PopulateTreeView(directory, ref dirNode); Application.DoEvents(); } } #endregion #region Files if (fileArray.Length != 0) { foreach (string file in fileArray) { FileInfo fi = new FileInfo(file); TreeNode fileNode = parentNode.Nodes.Add(fi.Name); FileNode fn = new FileNode(); fn.bIsDir = false; fn.file = fi; fileNode.Tag = fn; fileNode.ImageIndex = 1; Console.WriteLine(fi.Name + " - " + fi.LastAccessTime); } } #endregion } catch (UnauthorizedAccessException) { parentNode.Nodes.Add("Access denied"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { Application.DoEvents(); } } 

我知道属性之间的差异。 我需要的是文件保持完全相同的所有属性和元数据,就像我的程序从未触及过文件一样; 这包括上次访问日期。

我知道这远非理想,但您可以使用fsutil(随Windows提供)来禁用上次访问时间写入:

 fsutil behavior set disablelastaccess 1 

一旦完成,你可能会将它设置为0。 您可以使用C#中的Process.Start调用它,但必须有更好的编程方式(调用Windows API)。

 Process.Start("fsutil", "behavior set disablelastaccess 1").WaitForExit(); 

请注意,这是一个全局Windows设置,也会影响应用程序外部的磁盘访问…

访问时间与上次写入时间不同。 如果你使用fi.LastWriteTime,我想你会发现在explorer或cmd窗口中显示的时间是相同的。

当然,最后一次访问和最后一次写入可能是相同的,但它们不一定相同。

(将此作为回复而不是评论……)

我刚刚在这里运行了这段代码,它只留下了最后的访问时间 – 我无法重现您所看到的问题,因此Directory.GetFiles不会100%被破坏。

Filemon可以检查其他应用程序是否正在执行此操作: http : //technet.microsoft.com/en-us/sysinternals/bb896642.aspx

如果您正在进行取证并且您不希望修改驱动器,为什么要将其安装在可写模式下? 您应该以只读方式访问它,以保证您不会意外更改某些内容。 另外,我希望你没有在你正在检查的磁盘的操作系统中运行你的程序……你刚刚将磁盘添加到你控制的机器上,对吧?

不确定这是否相关,但是来自MSDN:

首次调用时,FileSystemInfo调用Refresh并返回API上的缓存信息以获取属性等。 在后续调用中,您必须调用Refresh以获取信息的最新副本。

顺便说一句,“LastAccessTime”基本上告诉你上次“查看”文件的时间。 在缺乏陈旧数据的情况下,这将永远是“现在”……不是特别有用,恕我直言。

访问时间将显示只读标记,最后一次写入将显示正在修改的文件。

我没试过这个,但谷歌建议:

禁用NTFS上次访问时间戳

这是一个全系统的变化,所以要注意这一点……

如果您正在访问磁盘以进行取证,那么您真的应该在硬件级别对整个硬盘进行写保护(因此这不是一个编程问题)。

谷歌搜索hdd "write protect"将揭示大量潜在的解决方案。