diff --git a/src/fs_utils.cpp b/src/fs_utils.cpp index 72e78bf4d..fc050fcd1 100644 --- a/src/fs_utils.cpp +++ b/src/fs_utils.cpp @@ -112,6 +112,58 @@ bool fsutils::isValidTorrentFile(const QString& torrent_path) { return true; } +/** + * Remove an empty folder tree. + * + * This function will also remove .DS_Store files on Mac OS and + * Thumbs.db on Windows. + */ +bool fsutils::smartRemoveEmptyFolderTree(const QString& dir_path) +{ + qDebug() << Q_FUNC_INFO << dir_path; + if (dir_path.isEmpty()) + return false; + + QDir dir(dir_path); + if (!dir.exists()) + return true; + + // Remove Files created by the OS +#if defined Q_WS_MAC + QFile::remove(dir_path + QLatin1String("/.DS_Store")); +#elif defined Q_WS_WIN + QFile::remove(dir_path + QLatin1String("/Thumbs.db")); +#endif + + QFileInfoList sub_files = dir.entryInfoList(); + foreach (const QFileInfo& info, sub_files) { + QString sub_name = info.fileName(); + if (sub_name == "." || sub_name == "..") + continue; + + QString sub_path = info.absoluteFilePath(); + qDebug() << Q_FUNC_INFO << "sub file: " << sub_path; + if (info.isDir()) { + if (!smartRemoveEmptyFolderTree(sub_path)) { + qWarning() << Q_FUNC_INFO << "Failed to remove folder: " << sub_path; + return false; + } + } else { + if (info.isHidden()) { + qDebug() << Q_FUNC_INFO << "Removing hidden file: " << sub_path; + if (!QFile::remove(sub_path)) { + qWarning() << Q_FUNC_INFO << "Failed to remove " << sub_path; + return false; + } + } else { + qWarning() << Q_FUNC_INFO << "Folder is not empty, aborting. Found: " << sub_path; + } + } + } + qDebug() << Q_FUNC_INFO << "Calling rmdir on " << dir_path; + return QDir().rmdir(dir_path); +} + /** * Returns the size of a file. * If the file is a folder, it will compute its size based on its content. diff --git a/src/fs_utils.h b/src/fs_utils.h index e46c5a331..4c0daece0 100644 --- a/src/fs_utils.h +++ b/src/fs_utils.h @@ -56,6 +56,7 @@ static QString branchPath(const QString& file_path, QString* removed = 0); static bool sameFileNames(const QString& first, const QString& second); static QString expandPath(const QString& path); static bool isValidTorrentFile(const QString& path); +static bool smartRemoveEmptyFolderTree(const QString& dir_path); /* Ported from Qt4 to drop dependency on QtGui */ static QString QDesktopServicesDataLocation(); diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index e74462e72..880acc26b 100644 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -98,58 +98,6 @@ static libtorrent::sha1_hash QStringToSha1(const QString& s) { return ret; } -/** - * Remove an empty folder tree. - * - * This function will also remove .DS_Store files on Mac OS and - * Thumbs.db on Windows. - */ -static bool smartRemoveEmptyFolderTree(const QString& dir_path) -{ - qDebug() << Q_FUNC_INFO << dir_path; - if (dir_path.isEmpty()) - return false; - - QDir dir(dir_path); - if (!dir.exists()) - return true; - - // Remove Files created by the OS -#if defined Q_WS_MAC - QFile::remove(dir_path + QLatin1String("/.DS_Store")); -#elif defined Q_WS_WIN - QFile::remove(dir_path + QLatin1String("/Thumbs.db")); -#endif - - QFileInfoList sub_files = dir.entryInfoList(); - foreach (const QFileInfo& info, sub_files) { - QString sub_name = info.fileName(); - if (sub_name == "." || sub_name == "..") - continue; - - QString sub_path = info.absoluteFilePath(); - qDebug() << Q_FUNC_INFO << "sub file: " << sub_path; - if (info.isDir()) { - if (!smartRemoveEmptyFolderTree(sub_path)) { - qWarning() << Q_FUNC_INFO << "Failed to remove folder: " << sub_path; - return false; - } - } else { - if (info.isHidden()) { - qDebug() << Q_FUNC_INFO << "Removing hidden file: " << sub_path; - if (!QFile::remove(sub_path)) { - qWarning() << Q_FUNC_INFO << "Failed to remove " << sub_path; - return false; - } - } else { - qWarning() << Q_FUNC_INFO << "Folder is not empty, aborting. Found: " << sub_path; - } - } - } - qDebug() << Q_FUNC_INFO << "Calling rmdir on " << dir_path; - return QDir().rmdir(dir_path); -} - // Main constructor QBtSession::QBtSession() : m_scanFolders(ScanFoldersModel::instance(this)), @@ -2336,7 +2284,7 @@ void QBtSession::readAlerts() { if (savePathsToRemove.contains(hash)) { const QString dirpath = savePathsToRemove.take(hash); qDebug() << "Removing save path: " << dirpath << "..."; - bool ok = smartRemoveEmptyFolderTree(dirpath); + bool ok = fsutils::smartRemoveEmptyFolderTree(dirpath); Q_UNUSED(ok); qDebug() << "Folder was removed: " << ok; }