20 if (QFileInfo(fileName).isAbsolute()) {
24 QFileInfo fallbackBaseDirInfo(baseDir);
26 return QFileInfo(QDir(fallbackBaseDirInfo.isDir() ?
27 fallbackBaseDirInfo.absoluteFilePath() :
28 fallbackBaseDirInfo.absolutePath()),
29 fileName).absoluteFilePath();
33 const QString &separator,
34 std::function<
bool(QString)> fileAllowedCallback)
36 const QFileInfo fileInfo(fileName);
39 QString proposedFileName = fileInfo.fileName();
41 QString baseName = fileInfo.baseName();
42 QString completeSuffix = fileInfo.completeSuffix();
52 QRegularExpression rex(QString(
"^([^.]+)%1\\d+(\\.(.+))?$").arg(separator));
53 auto match = rex.match(proposedFileName);
55 if (match.hasMatch()) {
57 baseName = match.captured(1);
58 completeSuffix = stringRemoveFirst(match.captured(2));
61 while (!fileAllowedCallback(proposedFileName)) {
62 QStringList fileParts = {baseName, separator, QString::number(counter++)};
64 if (!completeSuffix.isEmpty()) {
66 fileParts += completeSuffix;
68 proposedFileName = fileParts.join(
"");
71 return proposedFileName;