0

ファイルリストをソートしようとしましたが、成功しませんでした。

ファイルを再帰的に取得しますが、順序はありません。

コードは次のとおりです。

private void Step2_Load(object sender, EventArgs e)
{
    foreach (string file in GetFiles(PathClient))
    {
        string flist = "";
        if (file.Contains(PathClient + "\\"))
            flist = file.Replace(PathClient + "\\", "");
        else
             flist = file.Replace(PathClient, "");

         LB_FULL.Items.Add(flist);
    }
.
.
.

static IEnumerable<string> GetFiles(string path)
{
    Queue<string> queue = new Queue<string>();
    queue.Enqueue(path);
    while (queue.Count > 0)
    {
        path = queue.Dequeue();
        try
        {
            foreach (string subDir in Directory.GetDirectories(path))
                queue.Enqueue(subDir);
        }
        catch (Exception ex)
        {
            //ex
        }
        string[] files = null;
        try
        {
            files = Directory.GetFiles(path);
        }
        catch (Exception ex)
        {
            //ex
        }
        if (files != null)
        {
            for (int i = 0; i < files.Length; i++)
            {
                yield return files[i];
            }
        }
    }
}

OrderBy を試してみましたが、サブフォルダーに関係なく、ファイル名でのみ並べ替えます。

最初にサブフォルダーで並べ替え、次にファイル名で並べ替えます。

例のために。

/
/file_a.bla
/file_b.bla
/file_c.bla
/sub1/file_a.bla
/sub1/file_b.bla
/sub2/_file_x.bla
/testsub/a.bla
...

等々。

それを管理する方法はありますか?

4

1 に答える 1

0

独自の再帰的検索を行う必要がありますか、それとも Directory.GetFiles の適切なオーバーロードを使用できますか?

とにかく、そのオーバーロードを使用して、必要に応じてファイルを並べ替えることができます (サブサブディレクトリの順序については言及していません)。

string dirToSearch = @"C:\temp";
string[] files = Directory.GetFiles(dirToSearch, "*.*", SearchOption.AllDirectories);
var mySortedFiles = files.OrderBy(r => Path.GetDirectoryName(r)).
    ThenBy(p => p.Count(c => c == Path.PathSeparator)).
    ThenBy(s => Path.GetFileNameWithoutExtension(s)).
    Select(t => t.Replace(dirToSearch, ""));

foreach (string s in mySortedFiles)
    Console.WriteLine(s);

Console.ReadLine();

たとえば、次のようになります。

\CrossJoinA-H.sql
\ip-to-country.csv
\Kalimba.mp3
\LoadAssembly.sql
\ProcToUseAssembly.sql
\test.txt
\a\New Bitmap Image.bmp
\a\New Text Document.txt
\a\c\New Text Document.txt
\b\New Text Document.txt
\b\New Text Document (2).txt
于 2012-06-24T17:53:13.580 に答える