【问题标题】:Directory.EnumerateFiles read orderDirectory.EnumerateFiles 读取顺序
【发布时间】:2012-12-15 08:34:14
【问题描述】:

Directory.EnumerateFiles 方法的默认读取顺序是什么?是否一致?

根据我目前的经验,它似乎是在创建文件的日期之前,但我无法找到对此的确认。

我问的原因是因为我正在处理的程序的一部分将二进制文件从目录加载到对象中,然后再加载到数组中。这些对象通过索引数组相互引用,这意味着它们加载到数组中的顺序需要保持一致(以避免移动索引)。​​

在这里,我还有一个小问题。当文件被删除时,无论我做什么,它显然都会改变加载到数组中的文件的索引。有什么建议可以避免这个问题吗?到目前为止,由于担心存储问题,我一直避免使用字典(如果可以避免的话,我宁愿不存储文本键数组),但如果这是唯一可行的方法,我可能还是必须实现它。


编辑:在您的回答中获得出色提示后,我使用文件名重构为字典方法。性能影响几乎可以忽略不计,可读性和可维护性都得到了极大的改善,因此效果很好。

【问题讨论】:

  • 为什么不只保留参考而不是索引?如果您这样做,您就不必担心索引会被打乱。
  • 因为文件序列化的工作方式。如果我要通过序列化保存包含引用的文件,然后加载这些文件,那么我每次都会加载整个对象树,从而导致大量重复。例如,如果 Car 引用 Tire 和 Truck 引用 Tire,并且它们都被保存然后加载,我将有 2 个重复的 Tire 实例。
  • 取自MSDN,约GetFiles(本质上调用EnumerateFiles): 不保证返回文件名的顺序;如果需要特定的排序顺序,请使用 Sort() 方法。 如文档所述,我建议您使用自己的排序方法。

标签: c# arrays file indexing ienumerable


【解决方案1】:

.NET 使用的底层 Win32 API 是 FindFirstFileFindNextFiledocumentation specifically states

此函数返回文件名的顺序取决于文件系统类型。对于 NTFS 文件系统和 CDFS 文件系统,名称通常按字母顺序返回。对于 FAT 文件系统,名称通常按照文件写入磁盘的顺序返回,可能是也可能不是字母顺序。但是,如前所述,这些行为并不能得到保证。

所以不,您不能保证返回文件的顺序。其他答案提供了足够的方法来解决此问题。

【讨论】:

  • 我喜欢这个技术细节和链接。
【解决方案2】:

据我所知,它没有记录在案 - 因此即使您可以发现一种模式,也不应该依赖它。它可能取决于 .NET 的版本或操作系统的版本,或者只是在服务包之间更改。相反,如果你需要一些特定的顺序,你应该自己排序。当然,不幸的是,这需要在处理它们之前找到所有文件名,但这会给你带来一致性。

说实话,听起来您的数据模型非常脆弱。你还没有真正告诉我们你正在做什么来修复它,但是在Directory.EnumerateFiles 的结果中使用文件的整数索引肯定不是最好的方法。

如果您使用文件 name 而不是索引,这将允许您在阅读文件时处理文件,可能 - 但可能会有更好的方法,具体取决于您的试图做。使用名称应该仍然相当便宜——它只是一个字符串引用而不是一个整数,即使它在多个地方使用,它也会是对同一个字符串对象的多个引用。

【讨论】:

    【解决方案3】:

    文档没有指定顺序,但您始终可以通过使用 LINQ 的 OrderBy 函数来强制执行您想要的顺序。

    您可以通过清除对null 的引用来跳过索引更改,而不是实际从数组中删除项目。这里的权衡是您现在必须检查给定索引处的项目是否为null

    如果您有一个基于Dictionary 的更具可读性的数据结构,请考虑切换到它,并忽略效率问题,直到您的分析器告诉您必须优化代码的这个特定部分。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2011-07-03
      • 2022-06-22
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多