From a848d2ce688cee35e20d3dc0833f0cb49d1e3671 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sat, 11 Jun 2016 02:09:21 +0200 Subject: [PATCH] refs #585, utility function to make directory path relative and find first file existing --- src/blackmisc/fileutils.cpp | 33 +++++++++++++++++++++++++++++++++ src/blackmisc/fileutils.h | 6 ++++++ 2 files changed, 39 insertions(+) diff --git a/src/blackmisc/fileutils.cpp b/src/blackmisc/fileutils.cpp index c2541694b..098e52b16 100644 --- a/src/blackmisc/fileutils.cpp +++ b/src/blackmisc/fileutils.cpp @@ -121,6 +121,26 @@ namespace BlackMisc return n; } + QStringList CFileUtils::makeDirectoriesRelative(const QStringList &directories, const QString &rootDirectory, Qt::CaseSensitivity cs) + { + if (rootDirectory.isEmpty() || rootDirectory == "/") { return directories; } + const QString rd(rootDirectory.endsWith('/') ? rootDirectory.left(rootDirectory.length() - 1) : rootDirectory); + const int p = rd.length(); + QStringList relativeDirectories; + for (const QString &dir : directories) + { + if (dir.startsWith(rd, cs) && dir.length() > p + 1) + { + relativeDirectories.append(dir.mid(p + 1)); + } + else + { + relativeDirectories.append(dir); // absolute + } + } + return relativeDirectories; + } + Qt::CaseSensitivity CFileUtils::osFileNameCaseSensitivity() { return CBuildConfig::isRunningOnWindowsNtPlatform() ? Qt::CaseInsensitive : Qt::CaseSensitive; @@ -159,6 +179,19 @@ namespace BlackMisc return false; } + QString CFileUtils::findFirstExisting(const QStringList &filesOrDirectory) + { + if (filesOrDirectory.isEmpty()) { return ""; } + for (const QString &f : filesOrDirectory) + { + if (f.isEmpty()) { continue; } + const QString fn(normalizeFilePathToQtStandard(f)); + const QFileInfo fi(fn); + if (fi.exists()) { return fi.absoluteFilePath(); } + } + return ""; + } + QString CFileUtils::findFirstFile(const QDir &dir, bool recursive, const QStringList &nameFilters, const QStringList &excludeDirectories, std::function predicate) { if (isExcludedDirectory(dir, excludeDirectories)) { return QString(); } diff --git a/src/blackmisc/fileutils.h b/src/blackmisc/fileutils.h index 4fe6c60cc..d517d1680 100644 --- a/src/blackmisc/fileutils.h +++ b/src/blackmisc/fileutils.h @@ -61,6 +61,9 @@ namespace BlackMisc //! Normalize file path to Qt standard, e.g by turning \ to / static QString normalizeFilePathToQtStandard(const QString &filePath); + //! Make directory paths relative to root directory + static QStringList makeDirectoriesRelative(const QStringList &directories, const QString &rootDirectory, Qt::CaseSensitivity cs = osFileNameCaseSensitivity()); + //! Case sensitivity for current OS static Qt::CaseSensitivity osFileNameCaseSensitivity(); @@ -76,6 +79,9 @@ namespace BlackMisc //! Directory to be excluded? static bool isExcludedDirectory(const QString &directoryPath, const QStringList &excludeDirectories, Qt::CaseSensitivity cs = osFileNameCaseSensitivity()); + //! Find first existing file or directory + static QString findFirstExisting(const QStringList &filesOrDirectory); + //! Returns path to first file in dir which matches the optional wildcard and predicate, or empty string. static QString findFirstFile(const QDir &dir, bool recursive, const QStringList &nameFilters = {}, const QStringList &excludeDirectories = {}, std::function predicate = {});