11

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

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

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

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


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

4

3 回答 3

20

.NET 使用的底层 Win32 API 是FindFirstFileFindNextFile. 该文档特别指出

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

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

于 2012-12-31T04:11:07.560 回答
11

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

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

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

于 2012-12-31T04:02:39.220 回答
4

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

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

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

于 2012-12-31T04:06:42.710 回答