Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите плз, почему программа пустые папки не удаляет 
V
    Опции темы
lesniken
Дата 29.10.2010, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



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

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>

#include <tchar.h>

#pragma argsused

//---------------------------------------------------------------------------
char* ctooem(char* str)
{
    char* buf = new char[strlen(str) + 1];
    CharToOemA(str, buf);
    return buf;
}
//---------------------------------------------------------------------------
char* atooem(char* str)
{
    char* buf = new char[strlen(str) + 1];
    AnsiToOem(str, buf);
    return buf;
}
//---------------------------------------------------------------------------
bool FolderIsEmpty(UnicodeString Dir)
{   //смотрит пустая ли папка
    bool folderIsEmpty = true;
 //    ShowMessage(Dir);
    if(SetCurrentDir(Dir))
    {
        TSearchRec sr;
        if (FindFirst("*", faAnyFile, sr) == 0)
        {
           do
           {
             if(sr.Name != "." && sr.Name != "..")
             {
                folderIsEmpty = false;
             }
           } while (FindNext(sr) == 0);
        }
        FindClose(sr);
        return folderIsEmpty;
    }
    return false;
}
//---------------------------------------------------------------------------
int FolderSee(UnicodeString Dir)
{  //ходит по папкам

    if(SetCurrentDir(Dir))
        {
            TSearchRec sr;
            if (FindFirst("*", faAnyFile, sr) == 0)
            {
               do
               {
                 if(sr.Attr & faDirectory && sr.Name != "." && sr.Name != "..")
                 {
                     FolderSee(Dir+"\\"+sr.Name);
                    // ShowMessage(sr.Name+"|"+BoolToStr(FolderIsEmpty(Dir+"\\"+sr.Name)));
                     if(FolderIsEmpty(Dir+"\\"+sr.Name))  RemoveDir(Dir+"\\"+sr.Name);

                 }
               } while (FindNext(sr) == 0);
            }
            FindClose(sr);
        }
        else
        {
            wcout<<L"Невозможно открыть папку ";
            printf((Dir+"\n").t_str());
            return 1;
        }
 return 0;
}
//---------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
    if(argc != 2)
    {
       wcout<<L"Нужно запускать с 1 параметром:\n";
       wcout<<L"папка для которой нужно удалить пустые каталоги\n";
       return 1;
    }
    else
    {
        wcout<<L"Удаляем пустые каталоги в "<<argv[1]<<"...\n";
        FolderSee(UnicodeString(argv[1]));

        //cout<<ctooem(argv[1])<<endl;
        cin.get();
        return 0;
    }
}
//---------------------------------------------------------------------------


PM MAIL   Вверх
Alca
Дата 29.10.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Что возвращает RemoveDir? GetLastError ?


--------------------
PM WWW ICQ Skype Jabber   Вверх
lesniken
Дата 1.11.2010, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



ERROR_SHARING_VIOLATION
32 (0x20)
The process cannot access the file because it is being used by another process.

Никто кроме программы моей папки не использует, как программа завершается все удаляется нормально.
PM MAIL   Вверх
mrbrooks
Дата 1.11.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



lesniken, собственно твоя программа видимо папкой и пользуется. smile
PM MAIL   Вверх
lesniken
Дата 1.11.2010, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 22.3.2009

Репутация: нет
Всего: нет



проблема решилась так
Код

// удаляем пустые папки
bool DeleteDir(AnsiString DirName)
{
bool folderIsEmpty = true;
bool cfolderIsEmpty;
TSearchRec sr;
if (DirName.Length())
 {
 if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
 do
  {
  if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
   if (((sr.Attr & faDirectory) == faDirectory ) ||
   (sr.Attr == faDirectory))// найдена папка
    {
    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
    cfolderIsEmpty = DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
    if(cfolderIsEmpty)RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
    else if(folderIsEmpty && !cfolderIsEmpty) folderIsEmpty = false;
    }
    else// иначе найден файл
    {
       folderIsEmpty = false;
   // FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
   // DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
    }
  }
 while (!FindNext(sr));// ищем опять, пока не найдем все
 FindClose(sr);
 }
ShowMessage(DirName);
if(folderIsEmpty) RemoveDir(DirName);
return folderIsEmpty;
}

PM MAIL   Вверх
xvr
Дата 1.11.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Папкой пользовалась твой программа, вот этой функцией - SetCurrentDir.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0788 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.