web-dev-qa-db-ja.com

C#でDirectory.GetFilesの結果を並べ替える

ディレクトリ内のすべてのファイルをリストするこのコードがあります。

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()からの結果をソートするにはどうすればよいですか?

32
prosseek

LINQを使用すると非常に簡単です。

名前で並べ替えるには、

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

サイズで並べ替えるには、

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

日付順に並べ替えるには:(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オブジェクトの配列を配置してからOrderByLengthまたはNameプロパティにより、したがってこの実装です。また、とにかくFileInfoを作成するように見えるので、いずれの場合もFileInfoオブジェクトのコレクションを用意することをお勧めします。

申し訳ありませんが、最初は正しく理解できませんでした。質問とドキュメントをより注意深く読むべきです。

9
Dyppl

必要に応じて、FileInfoオブジェクトでLINQを使用できます。

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

これを試して、それは私のために働く

[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); });
0
guuds.com