В общем, нашёл, что под Windows ограничение на 255 символов, а под Linux на 255 байт, и написал такой код для копирования файлов с переименованием (там в имени сохраняются координаты прямоугольиков, и их может быть много, не лучшее решение, но это не я придумал).
std::string filename = current_image->path().stem().string();
#if OS == LINUX
for (const auto& ch : filename)
if (!std::isalpha(ch) && !std::isdigit(ch) &&
ch != ' ' && ch != '.' &&ch != '-' && ch != '_')
{
QMessageBox::warning(
this, "Warning",
"Файл не будет сохранён, т.к. содержит недопустимые символы в "
"своём имени.\nДопустимые символы: латинские буквы, цифры, "
"пробел, точка, '-' и '_'."
);
goto filename_invalidity;
}
#endif
for (const auto& rect : rect_grabber->getRects())
{
std::string rect_data = "_["
+ std::to_string(rect.x()) + "," + std::to_string(rect.y()) + ","
+ std::to_string(rect.width()) + "," + std::to_string(rect.height()) + ","
+ rect.getType() + "]";
if (filename.size() + rect_data.size()
+ current_image->path().extension().string().size() <= 255)
{
filename += rect_data;
}
else
{
QMessageBox::warning(
this, "Warning",
"Имя файла превысило максимально допустимую длину (255 символов)."
" Часть данных разметки не будет сохранена в имени файла."
);
break;
}
}
filename += current_image->path().extension().string();
fs::copy(current_image->path(),fs::path{load_window->getOutDirPath()/filename});
}
Всё это падает сразу после вывода второго QMessageBox::warning, т.е. при сохранении с переименованием. Но сам алгоритм исключает ситуацию, что будет сохранено более 255 символов (включая расширение с точкой). Что не так?