FC2ブログ

Qt+Windowsで数値順にソートされたファイル名一覧を取得する方法

Windowsのエクスプローラ等では、ファイル名に数値が含まれている場合に、数値の桁数が違っている場合でも、ちゃんと数値の大きさ順にファイルが並んで表示されますが、googleで調べると、そのような順序でファイル名をソートすることを英語では良く「NaturalSort」といわれることが多いようです。

そのNaturalSortですが、現状ではQtのAPIにはそのような順序でファイル一覧を取得する機能は実装されていません。

ですが、WindowsのAPIに「StrCmpLogicalW」という、数値を考慮してファイル名を比較する機能があり、これを使って次
のように実装すればエクスプローラのような順序でファイル一覧を取得することができます。

void NaturalSort(QStringList& files)
{
    struct
    {
        bool operator()(const QString& a, const QString& b)
        {
            int e = StrCmpLogicalW(
                (LPCWSTR)a.unicode(),
                (LPCWSTR)b.unicode());
            return e < 0;
        }
    } pred;

    qSort(files.begin(), files.end(), pred);
}

QStringList GetPngFilesNaturalSort(QString dir)
{
    QStringList filter;
    filter << "*.png";

    QDir d(dir);
    QStringList files = d.entryList(filter, QDir::Files, QDir::Name);
    NaturalSort(files);

    return files;
}

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター