【问题标题】:Question about windows system sorting problem关于windows系统排序问题的问题
【发布时间】:2011-03-01 08:58:55
【问题描述】:

如何获取与windows文件系统相同的文件序列?因为文件系统排序项太多:名称、大小、最后修改日期时间、标签(win 7)、评级(win 7),所以如果我使用CFileFind API模拟windows文件系统的排序行为是相当困难的。那么如何获取与windows文件系统顺序相同的文件呢?

【问题讨论】:

    标签: windows


    【解决方案1】:

    我不确定 CFindFile 的作用,但FindFirstFile 和朋友会按照它们在 NTFS 目录中存在的顺序返回文件。

    我不知道为什么这会是最理想的,不过,按照任何人的定义,它都不完全是“直观的”......

    【讨论】:

    • CFindFile 方法与 FindFirstFile 类似,都是按字母顺序排列的。有人建议我使用 IShellFolder API,有人熟悉 IShellFolder 方法吗?
    • 哦,我不明白你的问题......我以为你想要文件按文件系统顺序排序,而不是按资源管理器使用的顺序。 Explorer 使用 大约 与 StrCmpLogicalW 相同的顺序,因此您可以使用它对文件名进行排序。
    • Emm,我想像资源管理器一样检索文件序列,而不是文件系统顺序。但是资源管理器中的文件顺序是由用户在文件大小、上次修改日期时间等方面设计的,资源管理器中有很多排序标准,所以我无法模拟探索文件排序。所以将文件排序为 StrCmpLogicalW 是不够的。
    【解决方案2】:

    Raymond Chen 在"Why do NTFS and Explorer disagree on filename sorting?"上写了一篇相当详细的文章

    但是,请注意FindFirstFile() 及其亲属实际上并没有对结果进行排序 - 它只是按照文件系统提交文件的顺序将文件返回给您。 NTFS 有一个用于其自身目的的排序(我不确定是否指定了该排序 - 它对您来说似乎是有序的,这可能只是一个快乐的巧合)。 FAT 文件系统和网络文件系统将有自己的顺序(或没有顺序 - 文件可能只是在目录中按它们碰巧创建的顺序 - 我认为 FAT 系统就是这样)。

    如果您需要 FindFirstFile() 和朋友返回的文件的特定顺序,您需要自己进行排序。

    来自FindFirstFile() docs:“FindFirstFile 不对搜索结果进行排序。有关更多信息,请参阅 FindNextFile。”

    并且来自docs for FindNextFile():“搜索返回文件的顺序,如字母顺序,不能保证,并且取决于文件系统。如果必须对数据进行排序,则应用程序必须执行得到所有结果后排序。”

    CFileFind() 不承诺返回的文件名的顺序 - 如果它进行任何排序,我会感到惊讶(因为它必须从目标目录中获取所有可能的文件,然后才能返回第一个能够把它拉下来)。

    【讨论】:

    • Emm,我想和资源管理器一样检索文件序列,但是资源管理器中的文件序列是由用户在文件大小,最后修改日期时间等方面设计的,并且有很多排序标准explorer,所以我无法模拟探索文件排序。那么有什么方法可以让文件序列为explore?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2015-07-05
    • 2010-10-17
    • 1970-01-01
    • 2011-11-19
    • 2023-03-22
    相关资源
    最近更新 更多