47

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

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() 的结果进行排序?

4

5 回答 5

90

使用 LINQ 非常容易。

按名称排序,

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

按大小排序,

var sorted = Directory.GetFiles(".").OrderBy(f => new FileInfo(f).Length);
于 2011-06-09T14:21:22.860 回答
14

按日期排序:(返回 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对象数组放在适当的位置,然后OrderByLengthorName属性进行排序,因此这个实现。此外,看起来您无论如何都要创建,所以无论哪种情况FileInfo,最好有一个对象集合。FileInfo

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

于 2011-06-09T14:20:43.953 回答
5

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

var orderedFiles =  Directory.GetFiles("").Select(f=> new FileInfo(f)).OrderBy(f=> f.CreationTime)
于 2011-06-09T14:21:38.130 回答
0

试试这个,它对我有用

[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); });
于 2019-05-13T13:24:26.453 回答
0

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

Using Dir = System.IO;

string Source = yourVariable;
string SearchPattern = yourVariable;

Dir.Directory.GetFiles(Source, SearchPattern, Dir.SearchOption.AllDirectories).OrderBy(s => s).ToList();
于 2019-11-19T15:14:12.663 回答