Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Подскажите плз


Автор: lesniken 29.10.2010, 14:56
программа для удаления пустых папок
не могу понять в чем ошибка
кто может посмотрите плз
буду признателен
Код

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

#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;
    }
}
//---------------------------------------------------------------------------


Автор: Alca 29.10.2010, 15:17
Что возвращает RemoveDir? GetLastError ?

Автор: lesniken 1.11.2010, 08:49
ERROR_SHARING_VIOLATION
32 (0x20)
The process cannot access the file because it is being used by another process.

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

Автор: mrbrooks 1.11.2010, 09:13
lesniken, собственно твоя программа видимо папкой и пользуется. smile

Автор: lesniken 1.11.2010, 09:29
проблема решилась так
Код

// удаляем пустые папки
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;
}

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)