single.php

C# WinUI 3アプリでファイル一覧のソートを数字順にする

C# WinUI 3アプリを作っていく途中で、躓いた部分を備忘録的に投稿します。今回はWinUI3プロジェクトでアプリ名(ProductName)を取得する手順です。

既定値では1の次は10になる

例えば、System.IO.Directory.GetFiles().OrderByでファイル名を指定した場合

files = System.IO.Directory.GetFiles(directoryName).OrderBy(name => name).ToArray();

取得される一覧は、ファイル名の順番になりますがエクスプローラーで次のファイルが保存されているフォルダーの場合

1.txt
2.txt
3.txt
10.txt
11.txt

取得される一覧のソートは、こんな感じになります。

1.txt
10.txt
11.txt
2.txt
3.txt

これだと都合が悪い場合もあるので、数字順に並ぶように変更してみます。

Win32 StrCmpLogicalでソート

色々調べてみましたが、LinQで考えるよりもWin32で解決する方法が速く解決できました。

shlwapi.dll をインポートして、次のようなクラスを追加します。

public class StrCmpLogical : IComparer, IComparer<string>
{
  [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
  private static extern int StrCmpLogicalW(string x, string y);
  public int Compare(string x, string y)
  {
    return StrCmpLogicalW(x, y);
  }
  public int Compare(object x, object y)
  {
    return this.Compare(x.ToString(), y.ToString());
  }
}

後は、GetFilesのコードをStrCmpLogicalクラスを使って修正します。

files = System.IO.Directory.GetFiles(directoryName).OrderBy(name => name, new StrCmpLogical()).ToArray();

これで取得される一覧のソート順が数字順に並ぶようになりました。

1.txt
2.txt
3.txt
10.txt
11.txt

まとめ

今回は、短い記事でしたが、WinUI 3 アプリでファイルの一覧を取得する際に数字順でソートを行う方法について書きました。

おそらくLinQで正規表現などで解決できる方法もあると思いますが、Win32の方が得意なので新しいクラスを作って解決できました。

C#のWinUI 3プロジェクトでファイル一覧のソート順が数字にならない場合の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です