【问题标题】:Directory.GetFiles keeping the last access timeDirectory.GetFiles 保持上次访问时间
【发布时间】:2008-10-31 13:22:12
【问题描述】:

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();
            }
        }

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

【问题讨论】:

    标签: c# lastaccesstime


    【解决方案1】:

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

    fsutil behavior set disablelastaccess 1
    

    大概你会在完成后将其设置回 0。您可以使用 Process.Start 从 C# 调用它,但必须有更好的编程方式(调用 Windows API)。

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

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

    【讨论】:

    • FSUTIL 文档指出“这些选项中的大多数都需要重新启动才能生效。”
    【解决方案2】:

    访问时间与上次写入时间不同。如果您使用 fi.LastWriteTime 我想您会发现在资源管理器或 cmd 窗口中显示的时间是相同的。

    当然最后一次访问和最后一次写入可以相同,但不一定相同。

    【讨论】:

      【解决方案3】:

      (将其重新发布为回复而不是评论...)

      我刚刚在这里运行了这个 sn-p 代码,它只留下了最后一次访问时间 - 我无法重现您看到的问题,因此 Directory.GetFiles 没有 100% 的时间被破坏.

      Filemon 可以检查其他应用程序是否正在这样做:http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这不是“法医案件”。数据是原始数据的副本 - 这是我们发送给客户的实用程序。所以我们不能将他们的驱动器设置为写保护。
        【解决方案5】:

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

        第一次调用时,FileSystemInfo 调用 Refresh 并返回缓存的 获取属性的 API 信息 等等。在随后的通话中,您 必须调用 Refresh 来获取最新的 信息的副本。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我没有尝试过,但谷歌建议:

            Disable the NTFS Last Access Time Stamp

            这是系统范围的更改,因此请注意...

            【讨论】:

            • 这可能也是 FSUTIL(dbkk 建议)所做的。
            • 是的,它修改了相同的注册表项。有没有办法在不重启的情况下做到这一点?
            【解决方案8】:

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

            在 Google 上搜索 hdd "write protect" 会发现很多潜在的解决方案。

            【讨论】:

              猜你喜欢
              • 2014-06-14
              • 1970-01-01
              • 1970-01-01
              • 2018-07-20
              • 1970-01-01
              • 1970-01-01
              • 2021-05-22
              • 1970-01-01
              • 2020-08-08
              相关资源
              最近更新 更多