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プロジェクトでファイル一覧のソート順が数字にならない場合の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。