【问题标题】:Same File Different Creation Time相同的文件不同的创建时间
【发布时间】:2020-12-20 20:29:33
【问题描述】:

我正在查看完全相同的文件,它返回的创建时间不同:

  • FileInfo 实例我作为参数传递给函数
  • 函数中的IEnumerable<FileInfo>

请看下面,我看的是同一个文件(名称相同,见红框),但创建时间不同(见绿框)。这怎么可能,我该如何解决?他们应该是一样的。事实上,这个文件 (OptionTraderLog-2020-08-31_16_60_02_000018.tce) 甚至不应该出现在 Linq 表达式 (B) 中,因为我正在寻找创建时间大于这个文件的所有文件。

查看该函数的相关部分:

    protected override FileInfo GetNextFile(FileInfo currentLiveFile)
    {
        // currentLiveFile is A)
        // IEnumerable generated below is B)
        var allFilesInDirectory = currentLiveFile.Directory.GetFiles()
                                                           .Where(f => f.CreationTime > currentLiveFile.CreationTime)
                                                           .Where(f => Path.GetExtension(f.Name) == _fileExtension)
                                                           .OrderBy(f => f.CreationTime);
        // Rest of function...
    }

windows 指定的创建时间与上午 10:34:35 对齐,但创建时间和写入时间相同。我认为 Windows 正在考虑将 CreationTime 视为 WriteTime

【问题讨论】:

  • Windows 允许任意修改文件的创建、修改、最后写入和最后访问时间。根据底层文件系统或网络重定向器,内存文件控制块 (FCB) 或磁盘文件记录(例如 NTFS 中的 MFT 记录)中的时间戳可能与目录条目不同步。特别是如果文件有硬链接,给定硬链接的目录条目将反映上次使用该链接访问它的时间戳,这可能与 FCB 或文件记录中的当前值有很大不同。目录项不可靠。

标签: c# windows ienumerable fileinfo


【解决方案1】:

我通过在作为参数传递给函数的FileInfo 对象和枚举中的每个FileInfo 对象(在.Where())上调用.Refresh() 来解决它:

            Func<FileInfo, bool> GreaterCreationTimeThanFile = (f) 
            =>
            {
                f.Refresh();
                return f.CreationTime > currentLiveFile.CreationTime;
            };

//
// currentLiveFile.Directory.GetFiles().Where(GreaterCreationTimeThanFile)....
//

【讨论】:

  • 这仍然是一种竞争条件,您无法确定在Refresh() 返回后没有人会更改时间戳。
  • @TanveerBadar 它在我知道的一个文件夹中,因为没人会碰它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2010-12-13
  • 2010-12-13
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多