C# 如何对硬盘上显示的目录进行排序?

C# 如何对硬盘上显示的目录进行排序?,c#,C#,在我的硬盘上,例如: dir1 dir2 dir3 dir4 我的代码是: DirectoryInfo dInfo = new DirectoryInfo(AutomaticsubDirectoryName); DirectoryInfo[] subdirs = dInfo.GetDirectories(); 因此,在子目录中我得到了所有目录,但它们的顺序与硬盘上的顺序不同。 如何对它们进行排序,使它们在子目录中的顺序与在硬盘上的顺序相同 解决这个问题的办法是: DirectoryInfo

在我的硬盘上,例如:

dir1 dir2 dir3 dir4

我的代码是:

DirectoryInfo dInfo = new DirectoryInfo(AutomaticsubDirectoryName);
DirectoryInfo[] subdirs = dInfo.GetDirectories();
因此,在
子目录中
我得到了所有目录,但它们的顺序与硬盘上的顺序不同。 如何对它们进行排序,使它们在
子目录中的顺序与在硬盘上的顺序相同


解决这个问题的办法是:

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();
DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();
DirectoryInfo[]subdirs=dInfo.GetDirectories().OrderBy(d=>
{
int i=0;
如果(d.Name.Contains(“Lightning”)&&d.Name.Contains(“Length”)&&d.Name.IndexOf(“Lightning”)

工作正常。

假设您谈论的是文件系统以及Windows Explorer之类的软件如何显示名称,我想您谈论的是名称的自然排序。阅读此处:

Craetion time
是硬盘上显示时间的合理标准

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d => d.CreationTime).ToArray();

Windows使用的字符串比较函数公开给每个人使用。因此,您需要一点pinvoke来获得与Explorer使用的完全相同的排序顺序。将其包装到IComparer中,以便只将其传递给Array.Sort()或OrderBy()Linq子句:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class LogicalComparer : IComparer<string> {
    public int Compare(string x, string y) {
        return StrCmpLogicalW(x, y);
    }
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    private static extern int StrCmpLogicalW(string s1, string s2);
}
使用系统;
使用System.Collections.Generic;
使用System.Runtime.InteropServices;
公共类逻辑比较程序:IComparer{
公共整数比较(字符串x、字符串y){
返回strcplulogicalw(x,y);
}
[DllImport(“shlwapi.dll”,CharSet=CharSet.Unicode,ExactSpelling=true)]
私有静态外部int StrCmpLogicalW(字符串s1、字符串s2);
}
通过以下方式解决了此问题:

DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();
DirectoryInfo[] subdirs = dInfo.GetDirectories().OrderBy(d =>
                    {
                        int i = 0;
                        if (d.Name.Contains("Lightning ") && d.Name.Contains(" Length") && d.Name.IndexOf("Lightning ") < d.Name.IndexOf(" Length"))
                        {
                            string z = d.Name.Substring(("Lightning ").Length);
                            string f = z.Substring(0, z.IndexOf(" Length"));
                            if (Int32.TryParse(f, out i))
                                return i;
                            else
                                return -1;
                        }
                        else
                            return -1;
                    }).ToArray();
DirectoryInfo[]subdirs=dInfo.GetDirectories().OrderBy(d=>
{
int i=0;
如果(d.Name.Contains(“Lightning”)&&d.Name.Contains(“Length”)&&d.Name.IndexOf(“Lightning”)

工作正常。

您需要它的具体原因是什么?您知道它们在硬盘中的位置吗?您可以更具体一点吗?您如何知道光盘上目录的顺序?硬盘上的目录顺序不一致。应用程序(windows资源管理器,我假设它会给您一个命令)在显示该数组之前对其进行排序。文件系统中的目录也可以有特定的顺序,用户可以更改这些顺序。你想获得相同的顺序吗?我建议使用d.FullName,因为默认情况下,它们通常按名称排序。Hamlet Hakobyan不,这不好,但仍有一些目录不到位。在我的硬盘上,所有目录都是在以下日期创建的:1/6/2013 10:26 AMrydavilli no d.FullName给出相同的结果找到了解决方案。用解决方案更新了我的问题。