2009年1月21日 この記事のサンプルコードでは、不十分であることが判明しました。

改訂版のコードは、その4(補足) を参照ください。


急転直下の展開です。


既に自作したルーチンでスライドショーXをリリースしたのですが、そこへ友人からメールが…。


API の StrCmpLogicalW を使えば良いのでは?


すぐさま検索すると、出てくるは、出てくるは…。


使い方は簡単で、宣言して比較用のメソッドComparerTo等で使うだけです。


注意点は、引数をUnicodeで渡す必要があるため、宣言時にCharSet.Unicodeを忘れないように指定する必要があります。


以下にstringの代わりに使うサンプルクラスを掲載します。


======================== ここから ========================
using System.Runtime.InteropServices;

public class XPString : IComparable
{
  [DllImport("shlwapi.dll",
    CharSet = CharSet.Unicode,
    ExactSpelling = true)]
  private static extern int StrCmpLogicalW(
    string x, string y);
  
  private string _str;
  
  public XPString(string str)
  {
    this._str = str;
  }
  
  public int CompareTo(XPString other)
  {
    return StrCmpLogicalW(this._str, other._str);
  }
  
  public override string ToString()
  {
    return this._str;
  }
}
======================== ここまで ========================

ソートを行う場合は、このXPStringをデータとするListオブジェクトを作成して、Listへファイル名データを追加後、Sortメソッドを実行すれば、ListオブジェクトのデータがWindowsのファイル名順にソートされます。