23 #include "fileutils.h"
27 #include <QCryptographicHash>
28 #include <QDirIterator>
31 class FileUtilsTr :
public QObject
36 static QString cannotCreateDirectory()
38 return tr(
"cannot create directory");
41 static QString parentPathIsNotADirectory(
const QString &path)
43 return tr(
"the parent path is not a directory: %1").arg(path);
46 static QString lackOfParentDirectoryPermissions(
const QString &to)
48 return tr(
"lack of necessary permissions to the parent directory: %1")
53 FileUtilsTr() =
delete;
56 QByteArray FileUtils::md5(
const QString &path)
59 if (f.open(QIODevice::ReadOnly))
61 QCryptographicHash hash(QCryptographicHash::Md5);
62 QByteArray chunk = f.read(1024 * 1024);
63 for (; !chunk.isEmpty(); chunk = f.read(1024 * 1024))
73 static const int SANITY_LOOP_LIMIT = 1000;
74 QFileInfo fileInfo(QDir::cleanPath(path));
75 for (
int i = 0; i < SANITY_LOOP_LIMIT; ++i)
77 if (fileInfo.filePath().endsWith(
"/.."))
79 if (fileInfo.exists() || fileInfo.isRoot())
80 return fileInfo.filePath();
81 fileInfo = QFileInfo(QDir::cleanPath(fileInfo.filePath() +
"/.."));
86 Qt::CaseSensitivity FileUtils::comparisonSensitivity()
88 #if defined(Q_OS_WIN32)
89 return Qt::CaseInsensitive;
91 return Qt::CaseSensitive;
97 for (
const QString &candidate : candidates)
99 if (QFileInfo(candidate) == QFileInfo(path))
109 if (!dir.mkpath(
"."))
111 int errnoval = errno;
114 return DirErrno(dir.path(), errnoval, strerror(errnoval));
122 if (!pathToBottomMostExisting.isEmpty())
124 QFileInfo parentDir(pathToBottomMostExisting);
125 if (parentDir.exists() && !parentDir.isDir())
127 return DirErrno(dir.path(), DirErrno::CUSTOM_ERROR,
128 FileUtilsTr::parentPathIsNotADirectory(parentDir.filePath()));
132 ++qt_ntfs_permission_lookup;
133 bool permissions = parentDir.isReadable()
134 && parentDir.isWritable()
135 && parentDir.isExecutable();
136 --qt_ntfs_permission_lookup;
140 return DirErrno(dir.path(), DirErrno::CUSTOM_ERROR,
141 FileUtilsTr::lackOfParentDirectoryPermissions(parentDir.filePath()));
145 return DirErrno(dir.path(), DirErrno::CUSTOM_ERROR,
146 FileUtilsTr::cannotCreateDirectory());
153 const QStringList &nameFilters)
155 QDirIterator it(dirPath, nameFilters, QDir::Files);
156 bool bAllSuccess =
true;
159 QString path = it.next();
164 gLog << Log::tr(
"Failed to remove: %1").arg(path);
170 #include "fileutils.moc"