Мне нужно отсортировать список файлов на основе имени файла. Эти файлы собираются из QDirIterator.
Я использую решение, предоставленное здесь. TL;DR — используйте std::sort с QCollator.
Поскольку QCollator::compare(QString&, QString&) использует строки , мне нужно получить путь к файлу или имя файла (или какое-то уникальное строковое представление каждого файла для сортировки — мне нужно сортировать на основе имени файла)
Проблема:
При сортировке я получаю QFileInfo::filename()
каждого файла и пытаюсь сортировать на основе этого значения. Однако я достиг точки, когда это вызывает segv (см. код ниже). При отладке при попытке найти причину проблемы (в моем конкретном случае) a
сообщает о недоступности (см. второй скриншот).
Код для MVCE:
// header
QList<QFileInfo> fileInfoImageList, fileInfoVideoList;
QDir dataDirectory; // path that contains folders of various media type
// source
QCollator collator;
collator.setNumericMode(true);
QDirIterator it(dataDirectory.path(), combinedList, QDir::Filter::Files | QDir::Filter::NoDotAndDotDot | QDir::Filter::NoSymLinks, QDirIterator::IteratorFlag::Subdirectories);
while (it.hasNext() && !stopIteratorLoading) {
QFileInfo fi(it.next());
if (isImage(fi)) {
fileInfoImageList.append(fi);
}
else if (isVideo(fi)) {
fileInfoVideoList.append(fi);
}
}
std::sort(fileInfoImageList.begin(), fileInfoImageList.end(), [&collator](const QFileInfo & a, const QFileInfo & b) {
QString nameA = a.fileName(); < ------------- offending line causing segv
QString nameB = b.fileName();
return collator.compare(nameA, nameB);
});
std::sort(fileInfoVideoList.begin(), fileInfoVideoList.end(), [&collator](const QFileInfo & a, const QFileInfo & b) {
QString nameA = a.fileName();
QString nameB = b.fileName();
return collator.compare(nameA, nameB);
});
if (stopIteratorLoading) {
return;
}
//...
Что я могу сказать о путях к файлам, так это то, что некоторые из них могут достигать длины (и, возможно, более 180 символов), но это меньше, чем максимальная длина пути к файлу ограничена Windows.
Оскорбительная строка на std::sort
снимке экрана
Трассировка стека
QFileInfo::filename()
возвращаетa
, поэтому ваш компаратор не подчиняется строгим слабое упорядочение — это эффективная проверка отношения «s1 != s2», а не «s1 ‹ s2». Это неопределенное поведение.