From 69b4f9113a896dfc4ae4dc3dbaa804d0b9288e4e Mon Sep 17 00:00:00 2001 From: vkrishtal Date: Fri, 25 Apr 2014 00:28:22 +0400 Subject: [PATCH 1/2] BugFix: clementine cannot delete directories in file tab #858 --- src/core/filesystemmusicstorage.cpp | 41 ++++++++++++++++++++++++++++- src/core/filesystemmusicstorage.h | 3 +++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/core/filesystemmusicstorage.cpp b/src/core/filesystemmusicstorage.cpp index 1c7213f5c..5981cb01c 100644 --- a/src/core/filesystemmusicstorage.cpp +++ b/src/core/filesystemmusicstorage.cpp @@ -50,5 +50,44 @@ bool FilesystemMusicStorage::CopyToStorage(const CopyJob& job) { } bool FilesystemMusicStorage::DeleteFromStorage(const DeleteJob& job) { - return QFile::remove(job.metadata_.url().toLocalFile()); + bool result = false; + + QString path = job.metadata_.url().toLocalFile(); + QFileInfo fileInfo(path); + if (fileInfo.isDir()) + result = RemoveDirectory(path); + else + result = QFile::remove(path); + + return result; +} + +bool FilesystemMusicStorage::RemoveDirectory(const QString& dirName) { + bool result = true; + QDir dir(dirName); + + if (dir.exists(dirName)) { + auto fileInfoList = dir.entryInfoList(QDir::NoDotAndDotDot + | QDir::System + | QDir::Hidden + | QDir::AllDirs + | QDir::Files + , QDir::DirsFirst); + + for (auto info : fileInfoList) { + // remove subdirectories too + if (info.isDir()) { + result = RemoveDirectory(info.absoluteFilePath()); + } + else { + result = QFile::remove(info.absoluteFilePath()); + } + + if (!result) { + return result; + } + } + result = dir.rmdir(dirName); + } + return result; } diff --git a/src/core/filesystemmusicstorage.h b/src/core/filesystemmusicstorage.h index 71cae43dc..7721c47b3 100644 --- a/src/core/filesystemmusicstorage.h +++ b/src/core/filesystemmusicstorage.h @@ -30,6 +30,9 @@ class FilesystemMusicStorage : public virtual MusicStorage { bool CopyToStorage(const CopyJob& job); bool DeleteFromStorage(const DeleteJob& job); +private: + bool RemoveDirectory(const QString &dirName); + private: QString root_; }; From 42f62be5b663bd560243d3d664cc598f04d7fe11 Mon Sep 17 00:00:00 2001 From: vkrishtal Date: Fri, 25 Apr 2014 08:57:31 +0400 Subject: [PATCH 2/2] Fix after review --- src/core/filesystemmusicstorage.cpp | 43 ++++------------------------- src/core/filesystemmusicstorage.h | 3 -- src/core/utilities.cpp | 19 +++++++++---- src/core/utilities.h | 2 +- 4 files changed, 19 insertions(+), 48 deletions(-) diff --git a/src/core/filesystemmusicstorage.cpp b/src/core/filesystemmusicstorage.cpp index 5981cb01c..4895540e6 100644 --- a/src/core/filesystemmusicstorage.cpp +++ b/src/core/filesystemmusicstorage.cpp @@ -17,6 +17,7 @@ #include "filesystemmusicstorage.h" #include "core/logging.h" +#include "core/utilities.h" #include #include @@ -50,44 +51,10 @@ bool FilesystemMusicStorage::CopyToStorage(const CopyJob& job) { } bool FilesystemMusicStorage::DeleteFromStorage(const DeleteJob& job) { - bool result = false; - - QString path = job.metadata_.url().toLocalFile(); + QString path = job.metadata_.url().toLocalFile(); QFileInfo fileInfo(path); if (fileInfo.isDir()) - result = RemoveDirectory(path); + return Utilities::RemoveRecursive(path); else - result = QFile::remove(path); - - return result; -} - -bool FilesystemMusicStorage::RemoveDirectory(const QString& dirName) { - bool result = true; - QDir dir(dirName); - - if (dir.exists(dirName)) { - auto fileInfoList = dir.entryInfoList(QDir::NoDotAndDotDot - | QDir::System - | QDir::Hidden - | QDir::AllDirs - | QDir::Files - , QDir::DirsFirst); - - for (auto info : fileInfoList) { - // remove subdirectories too - if (info.isDir()) { - result = RemoveDirectory(info.absoluteFilePath()); - } - else { - result = QFile::remove(info.absoluteFilePath()); - } - - if (!result) { - return result; - } - } - result = dir.rmdir(dirName); - } - return result; -} + return QFile::remove(path); +} \ No newline at end of file diff --git a/src/core/filesystemmusicstorage.h b/src/core/filesystemmusicstorage.h index 7721c47b3..71cae43dc 100644 --- a/src/core/filesystemmusicstorage.h +++ b/src/core/filesystemmusicstorage.h @@ -30,9 +30,6 @@ class FilesystemMusicStorage : public virtual MusicStorage { bool CopyToStorage(const CopyJob& job); bool DeleteFromStorage(const DeleteJob& job); -private: - bool RemoveDirectory(const QString &dirName); - private: QString root_; }; diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index 5d3311a54..1cf6abd68 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -219,17 +219,24 @@ QString GetTemporaryFileName() { return file; } -void RemoveRecursive(const QString& path) { +bool RemoveRecursive(const QString& path) { QDir dir(path); for (const QString& child : - dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Hidden)) - RemoveRecursive(path + "/" + child); + dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Hidden)) { + if (!RemoveRecursive(path + "/" + child)) + return false; + } for (const QString& child : - dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Hidden)) - QFile::remove(path + "/" + child); + dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Hidden)) { + if (!QFile::remove(path + "/" + child)) + return false; + } - dir.rmdir(path); + if (!dir.rmdir(path)) + return false; + + return true; } bool CopyRecursive(const QString& source, const QString& destination) { diff --git a/src/core/utilities.h b/src/core/utilities.h index 8211f0d6e..9d32c8c1d 100644 --- a/src/core/utilities.h +++ b/src/core/utilities.h @@ -51,7 +51,7 @@ quint64 FileSystemFreeSpace(const QString& path); QString MakeTempDir(const QString template_name = QString()); QString GetTemporaryFileName(); -void RemoveRecursive(const QString& path); +bool RemoveRecursive(const QString& path); bool CopyRecursive(const QString& source, const QString& destination); bool Copy(QIODevice* source, QIODevice* destination);