Как выполнить сортировку имен файлов Microsoft в C / C ++?

0

Я успешно использовал так называемую "сортировку Windows" на С#, как показано ниже.

public class NativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, EntryPoint = "StrCmpLogicalW")]
    public static extern int StrCmpLogical(string x, string y);
}

private class NaturalSortComparer : IComparer
{
    public int Compare(object a, object b)
    {
        return NativeMethods.StrCmpLogical((string)a, (string)b);
    }
}

Исходя из стороны Unix, я очень мало знаю о вкусах Microsoft и вариациях C++, так что несите меня.

Как отсортировать файлы в C++, используя описанный выше подход? В случае, если это имеет значение: я НЕ использую MFC в этом конкретном проекте.

Мои файлы находятся в списке C++ std::list и мне нужно отсортировать их следующим образом (или аналогичным):

myFiles.sort();
  • 0
    почему вы делаете PInvoke для этого? Directory.EnumerateFiles должен сделать это для вас.
  • 2
    Просто напишите предикат сравнения на основе StrCmpLogical и передайте его для sort .
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ

Уважаемый человек:

Здесь решение:

list<string> myFiles;
myFiles.push_back("10.somefilename.ext");
myFiles.push_back("9.somefilename.ext");
myFiles.sort(compare);

Дополнительно:

bool compare(const string& first, const string& second)
{
    wstring lhs = widen(first);
    wstring rhs = widen(second);
    bool ordered = StrCmpLogicalW(lhs.c_str(), rhs.c_str()) < 0;
    return ordered;
}

В заключение:

wstring widen(string text)
{
    locale loc("");
    vector<wchar_t> buffer(text.size());
    use_facet< std::ctype<wchar_t> > (loc).widen(text.data(), text.data() + text.size(), &buffer[0]);
    return wstring(&buffer[0], buffer.size());
}

Сам.

  • 2
    Можете ли вы myFiles список myFiles перед сортировкой и затем widen каждую строку, создав list<wstring> который можно просто отсортировать? Это может быть заметно быстрее, чем расширение во время сравнения, если у вас есть какой-либо большой список (текущий алгоритм может неоднократно расширяться).
  • 0
    Хороший вопрос, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню