Russian Qt Forum

Qt => Общие вопросы => Тема начата: qlostTV от Февраль 20, 2012, 13:13



Название: QDir удаление каталога
Отправлено: qlostTV от Февраль 20, 2012, 13:13
Толи я пропустил, что-то толи при помощи QDir нельзя удалять не пустой каталог, так? нужно свое рекурсивное удаление писать?


Название: Re: QFileInfo удаление каталога
Отправлено: Пантер от Февраль 20, 2012, 13:18
QFileInfo вообще ничего не удаляет. Удаление делается через QDir и QFile. Рекурсивное удаление нужно самому реализовывать, но готовых примеров даже на этом форуме куча.


Название: Re: QFileInfo удаление каталога
Отправлено: qlostTV от Февраль 20, 2012, 13:23
QFileInfo вообще ничего не удаляет. Удаление делается через QDir и QFile. Рекурсивное удаление нужно самому реализовывать, но готовых примеров даже на этом форуме куча.
прошу прощения,грубая опечатка!
Ну и плохо, что не умеет, стандартная вещь вроде, ладно реализую свое.


Название: Re: QDir удаление каталога
Отправлено: Пантер от Февраль 20, 2012, 13:26
Лови, недавно писал на скорую руку:
Код
C++ (Qt)
bool removeDir (const QString &path)
{
QDir dir (path);
 
const QFileInfoList fileList = dir.entryInfoList (QDir::AllEntries | QDir::NoDotAndDotDot);
 
bool result = true;
QFile file;
 
for (QFileInfoList::const_iterator it = fileList.constBegin(),
end = fileList.constEnd(); result && it != end; ++it) {
const QString fileName = it->absoluteFilePath();
 
qDebug () << QString ("Remove ") + (it->isDir () ? "dir" : "file")
 << fileName;
 
file.setFileName (fileName);
 
result = it->isDir ()
? removeDir (fileName)
: file.remove ();
 
if (!result) {
qDebug () << file.errorString ();
}
}
 
return result && dir.rmdir (path);
}
 


Название: Re: QDir удаление каталога
Отправлено: qlostTV от Февраль 20, 2012, 13:28
Лови, недавно писал на скорую руку:
паси за старание! мне кажется это хак, такие вещи должны тролии делать=)


Название: Re: QDir удаление каталога
Отправлено: Авварон от Февраль 20, 2012, 14:03
У мну короче.
Код:
static bool removePath(const QString &path)
{
    bool result = true;
    QFileInfo info(path);
    if (info.isDir()) {
        QDir dir(path);
        foreach (const QString &entry, dir.entryList(QDir::AllDirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot)) {
            result &= removePath(dir.absoluteFilePath(entry));
        }
        if (!info.dir().rmdir(info.fileName()))
            return false;
    } else {
        result = QFile::remove(path);
    }
    return result;
}

Тролли не должны этого делать, тк рекурсивный ремув занимает много времени и должен выполняться в отдельном потоке.


Название: Re: QDir удаление каталога
Отправлено: qlostTV от Февраль 21, 2012, 07:04
Тролли не должны этого делать, тк рекурсивный ремув занимает много времени и должен выполняться в отдельном потоке.
Угу, в модели ФС у них есть удаление дык это сделанно не в отдельном потоке и пока удаление не закончится, все в ожидании=)


Название: Re: QDir удаление каталога
Отправлено: Igors от Февраль 21, 2012, 10:43
Таких фичес приложению вообще лучше не иметь, чтобы потом не было претензий типа "удалили мой проект над которым работал полгода !!!". Переключится в Finder/Explorer, там удалит (или скинет в trash) - не облезет


Название: Re: QDir удаление каталога
Отправлено: GreatSnake от Февраль 21, 2012, 11:27
Таких фичес приложению вообще лучше не иметь
Как сказать. Бывает нужно иногда удалять временный хлам (кэш, например).


Название: Re: QDir удаление каталога
Отправлено: QPeter от Март 19, 2014, 02:17
Понимаю, что тема старая, но предложенные варианты не работают, ну или работают, но не до конца(содержимое папки удаляется,  а сама она остается). Вдруг кто будет искать, вот 100% рабочая функция
Код:
//Функция удаления папки
int removeFolder(QDir & dir)
{
  int res = 0;
  //Получаем список каталогов
  QStringList lstDirs = dir.entryList(QDir::Dirs |
                  QDir::AllDirs |
                  QDir::NoDotAndDotDot);
  //Получаем список файлов 
  QStringList lstFiles = dir.entryList(QDir::Files);

  //Удаляем файлы
  foreach (QString entry, lstFiles)
  {
   QString entryAbsPath = dir.absolutePath() + "/" + entry;
   QFile::setPermissions(entryAbsPath, QFile::ReadOwner | QFile::WriteOwner);
   QFile::remove(entryAbsPath);
  }

  //Для папок делаем рекурсивный вызов 
  foreach (QString entry, lstDirs)
  {
   QString entryAbsPath = dir.absolutePath() + "/" + entry;
   QDir dr(entryAbsPath);
   removeFolder(dr);
  }

  //Удаляем обрабатываемую папку
  if (!QDir().rmdir(dir.absolutePath()))
  {
    res = 1;
  }
  return res;
}

Для новичков, на всякий случай, к переменным QDir путь можно присвоить через строковую переменную следующим образом:
Код:
QString str_path;
QDir dir_path;
str_path=".//C//project";
dir_path(str_path);