c# - Directory.GetFiles 保持上次访问时间

标签 c# lastaccesstime

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 设置,也会影响从您的应用程序外部访问磁盘...

关于c# - Directory.GetFiles 保持上次访问时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/253437/

相关文章:

c# - 将 C# 字符串传递给 C++,并将 C++ 结果(字符串、char*.. 任何)传递给 C#

c# - 修改 Lambda 表达式

c# - 从托管代码调用非托管 DLL 函数时出错

c# - 如何将默认 Entity Framework 列添加到现有数据库

bash - 上次访问时间未更新?

java - java中是否需要启用/etc/fstab中的 "atime"才能获得正确的上次访问时间?

file - 如何在Haskell(跨平台)中获取文件访问时间?

c# - 如何在RDLC中设置参数值