Make sure OS-created files do not prevent "empty" folder removal

Mac OS X creates .DS_Store files and Windows creates .Thumbs.db
files which can prevent otherwise empty folders removal.
This commit is contained in:
Christophe Dumez 2012-03-17 15:41:32 +02:00
parent 0b13fa6914
commit 41b57a0878

View file

@ -97,6 +97,58 @@ 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)),
@ -764,8 +816,10 @@ void QBtSession::deleteTorrent(const QString &hash, bool delete_local_files) {
if (delete_local_files) {
if (h.has_metadata()) {
QDir save_dir(h.save_path());
if (save_dir != QDir(defaultSavePath) && (defaultTempPath.isEmpty() || save_dir != QDir(defaultTempPath)))
if (save_dir != QDir(defaultSavePath) && (defaultTempPath.isEmpty() || save_dir != QDir(defaultTempPath))) {
savePathsToRemove[hash] = save_dir.absolutePath();
qDebug() << "Save path to remove (async): " << save_dir.absolutePath();
}
}
s->remove_torrent(h, session::delete_files);
} else {
@ -2288,7 +2342,7 @@ void QBtSession::readAlerts() {
if (savePathsToRemove.contains(hash)) {
const QString dirpath = savePathsToRemove.take(hash);
qDebug() << "Removing save path: " << dirpath << "...";
bool ok = QDir().rmdir(dirpath);
bool ok = smartRemoveEmptyFolderTree(dirpath);
Q_UNUSED(ok);
qDebug() << "Folder was removed: " << ok;
}