aboutsummaryrefslogtreecommitdiff
path: root/libs/uibase
diff options
context:
space:
mode:
Diffstat (limited to 'libs/uibase')
-rw-r--r--libs/uibase/include/uibase/filesystemutilities.h12
-rw-r--r--libs/uibase/src/filesystemutilities.cpp30
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