【问题标题】:C# How do I use Directory.GetFiles() to get files that have the same order as in Windows explorer?C# 如何使用 Directory.GetFiles() 获取与 Windows 资源管理器中顺序相同的文件?
【发布时间】:2012-08-01 02:30:11
【问题描述】:

是否可以获得与 Windows 资源管理器中相同的文件

我知道“自然排序”,但这不是我需要的,我需要在Windows资源管理器中获取按相同属性排序的文件列表,例如:

如果我通过属性“创建日期”订购了一个目录,那么我会得到一个如下的文件列表:

name                    create date    file size
1.txt                   2012/1/1        125Kb
2.tab                   2012/3/2        15Kb
3.bmp                   2013/5/5        26Kb

如果我的 Windows 资源管理器使用属性“文件大小”订购文件列表,则文件列表将是:

name                     create date    file size
2.tab                    2012/3/2        15Kb
3.bmp                    2013/5/5        26Kb
1.txt                    2012/1/1        125Kb

有人可以帮忙吗?

【问题讨论】:

标签: c# directory


【解决方案1】:

我认为这将比您预期的要复杂得多。文件夹设置存储在注册表中的两个位置:

HKCU\Software\Microsoft\Windows\Shell\BagMRU
HKCU\Software\Microsoft\Windows\Shell\Bags

第一个路径包含反映文件系统结构的结构,第二个路径包含有关这些项目的详细信息,包括一个名为“Sort”的 REG_BINARY 值,它记录了用于该文件夹的排序顺序。

有关结构的详细信息,包括示例代码(在 Python 中),请参阅 Willi Balenthin's website

【讨论】:

  • 谢谢先生,这就是我想要的。
【解决方案2】:

以下是获取按名称排序的文件列表的方法:

var path = @"C:\windows"; // obviously change this to whatever you want
var files = System.IO.Directory.GetFiles (path).ToList ();
file.Sort();

就是这样!

根据给定的代码示例,您将如何做到这一点:

var temperaturePressureSignalFilesList = Directory.GetFiles(TemperaturePressureSignalDirectory, "*.txt", SearchOption.TopDirectoryOnly).ToList();
temperaturePressureSignalFilesList.Sort();

【讨论】:

    【解决方案3】:

    使用 System.Linq;

    DirectoryInfo info = new DirectoryInfo("");文件信息 [] 文件 = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();前锋 (文件中的 FileInfo 文件){ // 做点什么... }

    这里是按创建时间获取目录中文件的示例代码。

    你可以通过同样的方式按大小获取文件。

    【讨论】:

    • hmm...但我不想使用 OrderBy() 函数,我需要在 Windows 资源管理器中获取按排序属性排序的文件,例如,如果 Windows 资源管理器中的文件按 CreateionTime 排序然后我可以得到按CreattionTime排序的文件列表,如果文件在Windows资源管理器中按“文件大小”排序,我可以得到按“文件大小”排序的文件列表......这意味着我的getfiles()函数将返回不同的结果通过文件资源管理器中的不同排序属性,请帮助~~
    • @ShawnLee 我认为您必须先获取 Windows 资源管理器的订单设置,然后才能获取文件。从注册表中检索信息键。
    • 如果树中的某个目录在 Windows 遍历目录时被重命名,Linq 操作员不会窒息吗?虽然不太优雅,但 stackoverflow.com/a/21084920/1429390 行中的一些错误检查对我来说似乎更安全。你怎么看?
    【解决方案4】:

    我猜你说的是 Windows 资源管理器中的查看窗格(它本质上是一个 Windows 文件管理器,但也有不同的名称)。需要进行一些澄清。您可以在各个列上应用自定义排序;此外,您可以打开多个按不同列排序的查看窗格(窗口)。因此,问题定义有点不清楚。

    假设您知道查看窗格中的排序顺序,那么您可以使用System.IO.DirectoryInfo 和派生的FileSystemInfo[] 对象;后者有files.OrderBy 方法。 希望这会有所帮助。我最好的,亚历克斯

    【讨论】:

      【解决方案5】:

      如果您想要自然排序顺序,您应该 P/Invoke StrCmpLogicalW (http://msdn.microsoft.com/en-us/library/bb759947.aspx) 或查找托管自然排序算法。 .NET Framework 中没有内置的自然排序。

      【讨论】:

        【解决方案6】:

        我认为您无法知道窗格中的顺序(按大小、名称或其他),您必须阅读列表,然后按照您想要的方式对其进行排序或提示用户选择排序属性。

        正如 Kenny 发布的 Sorting Directory.GetFiles() 这里是一种方法,无论如何我仍然认为不可能知道用户在查看窗格中选择的排序顺序。

        【讨论】:

        • ok 例如:这是文件列表的 Windows 自然视图窗格,我正在尝试对 25 50 80 115 145 进行排序,我想以与上例所示相同的顺序检索文件。虽然 GetFile() 按以下顺序给我列表 115 145 25 50 80
        • @AsadWaheed 对;窗格正在执行自己的排序,您也必须这样做。
        • 我需要我的排序,我该如何实现这个排序?
        • @AsadWaheed Shell 窗格按“自然”顺序排序,将 25 置于 115 之前,尽管“115”在词法排序中“25”之前。获得正确的自然排序很困难,尽管搜索该术语(和 C#)应该会得到一些简单的示例。
        • 您看到 SO 中有一个未回答的问题,关于从 Windows 资源管理器stackoverflow.com/questions/14401016/…获取排序字段@
        【解决方案7】:

        我认为您必须为 Windows 资源管理器编写一个 shell 扩展,该扩展捕获列上的排序事件并以某种结构化方式将该元数据写入磁盘。您可能打开了多个资源管理器窗口,因此应用时间戳或 id 可能是一个想法,以便您知道您正在处理哪个资源管理器窗口。然后在您的应用程序中读取该元数据以获取排序顺序并相应地应用。不容易,但可行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-15
          • 2011-07-05
          • 2011-11-05
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          • 1970-01-01
          相关资源
          最近更新 更多