From b01b04cd5c07c131d8e70365a87688b6bfcf7c32 Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Sun, 14 Oct 2018 12:13:53 +0200 Subject: [PATCH] Added emptyDirectory() --- CMakeLists.txt | 4 ++++ utils/fileutils.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++ utils/fileutils.h | 5 +++++ 3 files changed, 55 insertions(+) create mode 100644 utils/fileutils.cpp create mode 100644 utils/fileutils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a3b6c9b..72f23d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,12 +7,14 @@ set(HEADERS dbcorelib_global.h fixedsizematrix.h randomdevice.h + utils/fileutils.h utils/jsonutils.h utils/timeutils.h ) set(SOURCES randomdevice.cpp + utils/fileutils.cpp utils/jsonutils.cpp utils/timeutils.cpp ) @@ -25,6 +27,8 @@ target_link_libraries(dbcorelib Qt5::Core) target_include_directories(dbcorelib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +add_dependencies(libs dbcorelib) + add_executable(tst_fixedsizematrix tst_fixedsizematrix.cpp) add_test(tst_fixedsizematrix tst_fixedsizematrix) diff --git a/utils/fileutils.cpp b/utils/fileutils.cpp new file mode 100644 index 0000000..aafbc75 --- /dev/null +++ b/utils/fileutils.cpp @@ -0,0 +1,46 @@ +#include "fileutils.h" + +#include +#include +#include +#include +#include + +bool emptyDirectory(const QString &path) +{ + QDir dir(path); + + if(!dir.exists()) + { + qWarning() << "tried to empty non-existant dir" << path; + return true; + } + + bool success = true; + // not empty -- we must empty it first + QDirIterator di(dir.absolutePath(), QDir::AllEntries | QDir::Hidden | QDir::System | QDir::NoDotAndDotDot); + while (di.hasNext()) { + di.next(); + const QFileInfo& fi = di.fileInfo(); + const QString &filePath = di.filePath(); + bool ok; + if (fi.isDir() && !fi.isSymLink()) { + ok = QDir(filePath).removeRecursively(); // recursive + } else { + ok = QFile::remove(filePath); + if (!ok) { // Read-only files prevent directory deletion on Windows, retry with Write permission. + const QFile::Permissions permissions = QFile::permissions(filePath); + if (!(permissions & QFile::WriteUser)) + ok = QFile::setPermissions(filePath, permissions | QFile::WriteUser) + && QFile::remove(filePath); + } + } + if (!ok) + success = false; + } + + if(!success) + qWarning() << "could not empty" << path; + + return success; +} diff --git a/utils/fileutils.h b/utils/fileutils.h new file mode 100644 index 0000000..8614464 --- /dev/null +++ b/utils/fileutils.h @@ -0,0 +1,5 @@ +#pragma once + +#include "dbcorelib_global.h" + +bool DBCORELIB_EXPORT emptyDirectory(const QString &path);