Directory.EnumerateFiles
方法的默认阅读顺序是什么?它一致吗?
根据我的经验,到目前为止似乎是在文件创建之日,但我无法找到确认信息。
我问的原因是因为我正在处理的程序的一部分将二进制文件从目录加载到对象中,而这些对象又被加载到数组中。这些对象通过索引数组相互引用,这意味着它们加载到数组中的顺序需要保持一致(以避免转移索引)。
虽然我在这里,但还有另一个小问题。删除文件时,无论我做什么,它都会明显改变加载到数组中的文件的索引。有什么建议可以避免这个问题?由于担心存储问题,我之前一直避免使用字典(如果我可以避免存储,则宁愿不存储文本键数组)但是如果它是唯一可行的方法,我可能还是必须实现它。
编辑:在您的答案中提供优秀提示后,我使用文件名重构了字典方法。性能影响相当可以忽略不计,可读性和可维护性都得到了极大的改善,因此效果非常好。
答案 0 :(得分:14)
.NET使用的基础Win32 API是FindFirstFile
和FindNextFile
。 documentation specifically states:
此函数返回文件名的顺序取决于文件系统类型。使用NTFS文件系统和CDFS文件系统时,名称通常按字母顺序返回。对于FAT文件系统,名称通常按文件写入磁盘的顺序返回,这可能是也可能不是按字母顺序排列。但是,如前所述,这些行为无法保证。
所以不,你不能保证文件的退货顺序。其他答案提供了解决此问题的充分方法。
答案 1 :(得分:10)
据我所知,它没有记录 - 因此,即使你可以发现一个模式,你也不应该依赖它。它可能取决于.NET的版本或操作系统的版本,或者只是在服务包之间进行更改。相反,如果您需要某些特定订单,则应自行分类。当然,不幸的是,在处理它们之前需要找到所有文件名,但它会给你一致性。
说实话,听起来你的数据模型非常脆弱。你还没有真正告诉我们你正在采取什么措施来修复它,但在Directory.EnumerateFiles
的结果中使用文件的整数索引肯定不是最好的方法。< / p>
如果您使用文件 name 而不是索引,那么您可以在阅读文件时处理文件,但可能会有更好的方法,具体取决于您的用途试图做。使用这个名称应该仍然相当便宜 - 它只是一个字符串引用而不是一个整数,即使它在多个地方使用,它也会对同一个字符串对象进行多次引用。
答案 2 :(得分:4)
文档未指定顺序,但您始终可以使用LINQ的OrderBy
函数强制执行所需的顺序。
您可以通过清除对null
的引用来跳过索引更改,而不是实际从数组中删除项目。这里的权衡是您现在必须检查给定索引处的项目是否为null
。
如果您有一个基于Dictionary
的可读数据结构,请考虑切换到它,并忽略效率问题,直到您的探查器告诉您必须优化代码的这一特定部分。