Я успешно использовал так называемую "сортировку 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();
Уважаемый человек:
Здесь решение:
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());
}
Сам.
myFiles
список myFiles
перед сортировкой и затем widen
каждую строку, создав list<wstring>
который можно просто отсортировать? Это может быть заметно быстрее, чем расширение во время сравнения, если у вас есть какой-либо большой список (текущий алгоритм может неоднократно расширяться).
Directory.EnumerateFiles
должен сделать это для вас.StrCmpLogical
и передайте его дляsort
.