【问题标题】:Sorting the result of Directory.GetFiles in C#在 C# 中对 Directory.GetFiles 的结果进行排序
【发布时间】:2022-05-11 11:41:50
【问题描述】:

我有这段代码可以列出目录中的所有文件。

class GetTypesProfiler
{
    static List<Data> Test()
    {
        List<Data> dataList = new List<Data>();
        string folder = @"DIRECTORY";
        Console.Write("------------------------------------------\n");
        var files = Directory.GetFiles(folder, "*.dll");
        Stopwatch sw;
        foreach (var file in files)
        {   
            string fileName = Path.GetFileName(file);
            var fileinfo = new FileInfo(file);
            long fileSize = fileinfo.Length;
            Console.WriteLine("{0}/{1}", fileName, fileSize);
        }
        return dataList;
    }
    static void Main()
    {
         ...
    }
}

我需要根据文件大小或字母顺序打印出文件信息。如何对 Directory.GetFiles() 的结果进行排序?

【问题讨论】:

标签: c# sorting getfiles


【解决方案1】:

使用 LINQ 非常简单。

按名称排序,

var sorted = Directory.GetFiles(".").OrderBy(f => f);

按大小排序,

var sorted = Directory.GetFiles(".").OrderBy(f => new FileInfo(f).Length);

【讨论】:

  • 你知道当你用 Directory.GetFile() 检索文件时文件是如何排序的吗?
  • @Bosak:很可能是一些与文件系统的细节有关的顺序,就像dir 给你一个一致但看起来随机的顺序。
  • 在我的电脑上,它按字母顺序提供文件和目录。我正在使用 Windows 7
  • 你能解释一下那个 lambda 实际上在做什么吗?在我看来,它好像在回归,但这没有什么意义。
  • @kingfrito_5005 这些 lambda 表达式只是将集合中的每个值映射为任意排序值——这允许例如使用i =&gt; Math.Abs(i) 按绝对值对整数进行排序。但是在很多情况下,我们有一组可比较的值,我们只想对其进行排序,而不需要任何花哨的预测。按值排序整数? OrderBy(i =&gt; i)。按值对字符串进行排序? OrderBy(s =&gt; s)。在这种情况下,我们正在对文件名(字符串)进行排序。
【解决方案2】:

按日期排序:(返回 FileInfo 的可枚举):

Directory.GetFiles(folder, "*.dll").Select(fn => new FileInfo(fn)).
                                    OrderBy(f => f.Length);

或者,按名称订购:

Directory.GetFiles(folder, "*.dll").Select(fn => new FileInfo(fn)).
                                    OrderBy(f => f.Name);

创建FileInfo 实例对于按文件名排序不是必需的,但如果您想动态应用不同的排序方法,最好将您的FileInfo 对象数组放在适当的位置,然后只使用OrderBy 它们通过LengthName 属性,因此这个实现。另外,看起来你无论如何都要创建FileInfo,所以最好有一个FileInfo对象的集合。

对不起,我第一次没有做对,应该更仔细地阅读问题和文档。

【讨论】:

  • GetFiles 返回一个字符串数组,而不是文件信息。
  • 这不是按文件长度排序,而是按文件名长度排序。
  • 这将根据文件名的长度而不是文件本身的长度进行排序。
【解决方案3】:

如果您愿意,可以在 FileInfo 对象上使用 LINQ:

var orderedFiles =  Directory.GetFiles("").Select(f=> new FileInfo(f)).OrderBy(f=> f.CreationTime)

【讨论】:

    【解决方案4】:

    试试这个,它对我有用

    [System.Runtime.InteropServices.DllImport("Shlwapi.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string psz1, string psz2);
    DirectoryInfo di = new DirectoryInfo(path);
    FileInfo[] arrFi = di.GetFiles("*.*");
    Array.Sort(arrFi, delegate(FileInfo x, FileInfo y) { return StrCmpLogicalW(x.Name, y.Name); });
    

    【讨论】:

      【解决方案5】:

      如果您只需要按文件名排序并且文件标题支持升序或降序逻辑顺序,则此方法有效。我添加变量以更好地控制源和搜索模式。

      Using Dir = System.IO;
      
      string Source = yourVariable;
      string SearchPattern = yourVariable;
      
      Dir.Directory.GetFiles(Source, SearchPattern, Dir.SearchOption.AllDirectories).OrderBy(s => s).ToList();
      

      【讨论】:

        【解决方案6】:
        // Getting Directory object
        DirectoryInfo directoryInfo = new DirectoryInfo(folderName);
        
        // getting files for this folder
        FileInfo[] files = directoryInfo.GetFiles();
        
        // Sorting using the generic Array.Sort function based on Names comparison
        Array.Sort(files, delegate (FileInfo x, FileInfo y) { return String.Compare(x.Name, y.Name); });
        
        // Sorting using the generic Array.Sort function based on the creation date of every folder
        Array.Sort(files, delegate (FileInfo x, FileInfo y) { return DateTime.Compare(x.CreationTime, y.CreationTime); });
        

        Array Sort

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        相关资源
        最近更新 更多