2012-12-31 87 views
8

Directory.EnumerateFiles方法的默认读取顺序是什么?它一致吗?Directory.EnumerateFiles读取顺序(C#)

根据我的经验,迄今为止似乎是创建文件的日期,但我一直未能找到确认。

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

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


编辑:从你的答案极好的提示后,我已经重构使用文件名的字典方法。性能影响相当可忽略,可读性和可维护性都大大提高,因此工作得很好。

+0

为什么不只是保留一个引用而不是索引?如果你这样做,你不必担心索引被洗牌。 – casperOne

+0

由于文件序列化的工作方式。如果我要通过序列化保存包含引用的文件,然后加载这些文件,每次都会加载整个对象树,导致大量复制。例如,如果汽车引用轮胎和卡车引用轮胎,并且他们都被保存然后加载,我会有2个重复的轮胎实例。 – Djentleman

+2

来自[MSDN](http://msdn.microsoft.com/en-us/library/07wt70x2.aspx),关于'GetFiles'(本质上调用'EnumerateFiles'):*返回的文件名的顺序是不保证;如果需要特定的排序顺序,请使用Sort()方法。*我建议您,如文档所述,使用您自己的排序方法。 – Mir

回答

10

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

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

如果您使用文件名称而不是索引,这将允许您在阅读文件时处理文件,但有可能 - 但根据您想要做什么,可能会有更好的方法。使用这个名字应该还是相当便宜 - 它只是一个单一的字符串引用而不是一个整数,即使它在多个地方使用,它也会被多次引用到同一个字符串对象。

4

该文档没有指定订单,但您可以始终使用LINQ的OrderBy函数强制执行您的订单。

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

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

13

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

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

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

+0

谢谢。有用! – Shimmy

+0

我喜欢这个技术细节和链接。 – Gqqnbig