diff options
Diffstat (limited to 'libs/uibase')
| -rw-r--r-- | libs/uibase/include/uibase/filesystemutilities.h | 12 | ||||
| -rw-r--r-- | libs/uibase/src/filesystemutilities.cpp | 30 |
2 files changed, 42 insertions, 0 deletions
diff --git a/libs/uibase/include/uibase/filesystemutilities.h b/libs/uibase/include/uibase/filesystemutilities.h index ae074c6..a98ba7b 100644 --- a/libs/uibase/include/uibase/filesystemutilities.h +++ b/libs/uibase/include/uibase/filesystemutilities.h @@ -31,6 +31,18 @@ QDLLEXPORT QString sanitizeFileName(const QString& name, **/ QDLLEXPORT bool validFileName(const QString& name); +/** + * @brief Resolve a file path case-insensitively on Linux. + * + * On Windows (case-insensitive FS), returns the input path as-is. + * On Linux, if the exact path doesn't exist, searches the parent directory + * for a file matching the name case-insensitively. + * + * @param path the absolute file path to resolve + * @return the resolved path (with correct case) or the original path if not found + */ +QDLLEXPORT QString resolveFileCaseInsensitive(const QString& path); + } // namespace MOBase #endif // FILESYSTEM_H diff --git a/libs/uibase/src/filesystemutilities.cpp b/libs/uibase/src/filesystemutilities.cpp index 6a01324..b027f5f 100644 --- a/libs/uibase/src/filesystemutilities.cpp +++ b/libs/uibase/src/filesystemutilities.cpp @@ -1,5 +1,7 @@ #include <uibase/filesystemutilities.h> +#include <QDir> +#include <QFileInfo> #include <QRegularExpression> #include <QString> @@ -65,4 +67,32 @@ bool validFileName(const QString& name) return (name == sanitizeFileName(name)); } +QString resolveFileCaseInsensitive(const QString& path) +{ +#ifdef _WIN32 + return QDir::cleanPath(path); +#else + const QFileInfo info(path); + if (info.exists()) { + return info.absoluteFilePath(); + } + + QDir dir(info.path()); + if (!dir.exists()) { + return QDir::cleanPath(path); + } + + const QString target = info.fileName(); + const QStringList entries = + dir.entryList(QDir::Files | QDir::Readable | QDir::Hidden | QDir::System); + for (const QString& entry : entries) { + if (entry.compare(target, Qt::CaseInsensitive) == 0) { + return dir.absoluteFilePath(entry); + } + } + + return QDir::cleanPath(path); +#endif +} + } // namespace MOBase |
