Russian Qt Forum
Ноябрь 24, 2024, 19:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDir удаление каталога  (Прочитано 13115 раз)
qlostTV
Гость
« : Февраль 20, 2012, 13:13 »

Толи я пропустил, что-то толи при помощи QDir нельзя удалять не пустой каталог, так? нужно свое рекурсивное удаление писать?
« Последнее редактирование: Февраль 20, 2012, 13:22 от QLostTV » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 20, 2012, 13:18 »

QFileInfo вообще ничего не удаляет. Удаление делается через QDir и QFile. Рекурсивное удаление нужно самому реализовывать, но готовых примеров даже на этом форуме куча.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qlostTV
Гость
« Ответ #2 : Февраль 20, 2012, 13:23 »

QFileInfo вообще ничего не удаляет. Удаление делается через QDir и QFile. Рекурсивное удаление нужно самому реализовывать, но готовых примеров даже на этом форуме куча.
прошу прощения,грубая опечатка!
Ну и плохо, что не умеет, стандартная вещь вроде, ладно реализую свое.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 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);
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qlostTV
Гость
« Ответ #4 : Февраль 20, 2012, 13:28 »

Лови, недавно писал на скорую руку:
паси за старание! мне кажется это хак, такие вещи должны тролии делать=)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Февраль 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;
}

Тролли не должны этого делать, тк рекурсивный ремув занимает много времени и должен выполняться в отдельном потоке.
Записан
qlostTV
Гость
« Ответ #6 : Февраль 21, 2012, 07:04 »

Тролли не должны этого делать, тк рекурсивный ремув занимает много времени и должен выполняться в отдельном потоке.
Угу, в модели ФС у них есть удаление дык это сделанно не в отдельном потоке и пока удаление не закончится, все в ожидании=)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 21, 2012, 10:43 »

Таких фичес приложению вообще лучше не иметь, чтобы потом не было претензий типа "удалили мой проект над которым работал полгода !!!". Переключится в Finder/Explorer, там удалит (или скинет в trash) - не облезет
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Февраль 21, 2012, 11:27 »

Таких фичес приложению вообще лучше не иметь
Как сказать. Бывает нужно иногда удалять временный хлам (кэш, например).
Записан

Qt 5.11/4.8.7 (X11/Win)
QPeter
Гость
« Ответ #9 : Март 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);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 22.