среда, 27 января 2010 г.

Продолжаем удалять файлы и каталоги

Функция рекурсивного удаления папок не работает если в папке есть файлы только для чтения.
Функция QFile::remove() при попытке удалить такой файл возвращает false. Чтобы этого избежать нужно выставлять права для таких файлов. В Qt для этого есть функция
bool QFile::setPermissions ( const QString & fileNamePermissions permissions )   [static]
Таким образом окончательный вид функции удаления каталога имеет вид:
//Функция удаления папки
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;
}


* This source code was highlighted with Source Code Highlighter.



4 комментария:

  1. Спасибо большое! помогло. респект ;)

    ОтветитьУдалить
  2. Совсем забыл об этой особенности файловой системы. Спасибо.

    ОтветитьУдалить
  3. Не удаляет скрытые файлы

    ОтветитьУдалить
  4. Думаю стоит разделить функционал этой функции на две части. Или опционально параметром передавать флаг - нужно удалять такие файлы или нет. Если они read-olny, на то может быть причина :)

    ОтветитьУдалить