crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как лучше всего организовать удаление каталога со всем содержимым?
Rocky
  опции профиля:
сообщение 27.12.2008, 18:27
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Всем привет!

Как лучше всего организовать удаление директория со всем содержимым?

QDir::rmdir удаляет только пустые папки. Соответственно можно написать рекурсивную функцию в которой удалять все подряд (начиная от самой глубокой вложенной папки). А можно ли это сделать каким-нибудь стандартным способом? (например, в winAPI DeleteDirectory(...) тож не удаляет, но есть SHFileOperation в которой таких ограничений нет).

Спасибо!

Сообщение отредактировал Litkevich Yuriy - 27.12.2008, 18:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 20:09
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Пвсевдокод:
bool DirDelete (QDir dir)
{
bool res=true;

    file_list = получить список файлов;
    if (file_list)
        res = удалить все файлы;//при ошибке вернет "ложь"

    dir_list = получить все каталоги в текущем кроме ./  и ../
    if (dir_list)
        для каждого кталога из dir_list делать
        {
            if (! DirDelete(dir_list.dir) )  // т.е. рекурсия
                return false;
        }
    res = dir.удалить();//при ошибке вернет "ложь"
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 27.12.2008, 23:21
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Спасибо, так и сделал )) Тему можно закрывать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 23:43
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 28.12.2008, 2:21) *
Тему можно закрывать
дак может ты исходник функции выложишь. ;)



П.С. А можешь и в ЧаВо ее закинуть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 28.12.2008, 0:20
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Без проблем ))
Ток я лучче сюда, в факе еще напортачу че-нить на ночь глядя.

void DeleteAllFiles(const QString &path) 
{
    QDir oDir(path);
    QStringList files = oDir.entryList(QDir::Files);

    QStringList::Iterator itFile = files.begin();
    while (itFile != files.end())
    {
        QFile oFile(path + "/" + *itFile);
        oFile.remove();
        ++itFile;
    }

    QStringList dirs = oDir.entryList(QDir::Dirs);
    QStringList::Iterator itDir = dirs.begin();
    while (itDir != dirs.end())
    {
        if (*itDir != "." && *itDir != "..") DeleteAllFiles(path + "/" + *itDir);
        ++itDir;
    }

    oDir.rmdir(path);
}


Вроде работает, я тестил ))

Сообщение отредактировал Litkevich Yuriy - 28.12.2008, 0:22
Причина редактирования: используй параметр у тэга код: code=cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 28.12.2008, 19:31
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Litkevich Yuriy @ 27.12.2008, 23:43) *
П.С. А можешь и в ЧаВо ее закинуть
Закинул: Удаление директории с поддиректориями и файлами
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 29.12.2008, 10:58
Сообщение #7


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Я недавно по работе делал такую-же функцию.
Вот ее реализация:
void Table::recursiveDeletion(QString path) 
{
    QDir dir(path);
    QStringList files = dir.entryList(QDir::Files);

    QStringList::Iterator itFile = files.begin();
    while (itFile != files.end())
    {
        QFile file(path + "/" + *itFile);
        file.remove();
        ++itFile;
    }

    QStringList dirs = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
    QStringList::Iterator itDir = dirs.begin();
    while (itDir != dirs.end())
    {
        recursiveDeletion(path + "/" + *itDir);
        ++itDir;
    }

    dir.rmdir(path);
}

с той лишь разницей что у меня стоял фильтр NoDotAndDotDot вместо проверки if (*itDir != "." && *itDir != "..")
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.2.2020, 14:16