refs #585, utility function to make directory path relative and find first file existing

This commit is contained in:
Klaus Basan
2016-06-11 02:09:21 +02:00
parent 04d5239300
commit a848d2ce68
2 changed files with 39 additions and 0 deletions

View File

@@ -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<bool(const QFileInfo &)> predicate)
{
if (isExcludedDirectory(dir, excludeDirectories)) { return QString(); }

View File

@@ -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<bool(const QFileInfo &)> predicate = {});