Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > файлы


Автор: papam 14.5.2006, 14:48
Подскажите почему не работает программа?
я написал программу для удаления каталогов должны удаляются все вложенные папки и файлы. 

Параметры должны передаваться через командную строку:delete.exe c:\A 
Вот код:
Код

#include <stdio.h>    
#include <io.h>       
#include <string.h>  
#include <windows.h> 
#include <iostream.h> 
#include <direct.h> 


#define MAX_PATH 260

#define Size 50

    _finddata_t find;

char* RussianMessage(char path[])
{
    CharToOem(path,path);
    return path;
}

void RemoveFile(_finddata_t *f)
{
    char Name[MAX_PATH];
   
    strcpy(Name, f->name);
    
    if (remove(Name)!=0)
    {
        cout << "\nError!\n Couldn't remove file."<< endl;
           RussianMessage(Name);
            printf("%s>",Name);
    }

    else 
    {
        cout << "Ok..." <<endl;
    RussianMessage(Name);
    printf("%s>",Name);
    }
}

void RemoveDir(_finddata_t *f)
{
if(_rmdir(f->name)!=0)    
{
    cout << "\nError!\n Couldn't remove directory."<< endl;
    RussianMessage(f->name);    
                        printf("%s>",f->name);
}
    else 
    {
        cout << "Ok..." <<endl;
    RussianMessage(f->name);
    printf("%s>",f->name);
    }
}

void main(int argc, char * argv[])
{

   char path[70];
   strcpy(path, argv[1]);
    
 
   char mask[15]="*.*";

  
   strcat(path, mask);
    
  
   _finddata_t *fileinfo=new _finddata_t;    

   
   long done = _findfirst(path,fileinfo);
    
   int MayWeWork = done;     
   int count = 0;   
   while (MayWeWork!=-1)
   {    
      count++;
      
    
      if(strcmp(fileinfo->name,".")&&strcmp(fileinfo->name,".."))
      {
            
            fileinfo->attrib&_A_SUBDIR?RemoveDir(fileinfo):RemoveFile(fileinfo);
      }


   
      MayWeWork = _findnext(done, fileinfo);        
   }
   cout << "\nInformation: was found " << count
        << " file(s) in folder..." << path << endl;

   _findclose(done);
   delete fileinfo;


}

 

Автор: bsa 14.5.2006, 21:35
Надо писать рекурсивную функцию:
1. на входе путь к каталогу или файлу.
2. если это файл, то удаляем и выходим.
3. получаем весь список файлов/каталогов находящихся внутри него
4. идем по списку и вызываем саму себя с указателем на текущую запись в каталоге.
5. пытаемся удалить исходный каталог (который передан в качестве параметра).
 

Автор: Любитель 15.5.2006, 17:09
Что-типа этого
Код

bool RemoveDir(cosnt char *path)
{
     if (_rmdir(path) == 0)
          return true;
     if (errno != ENOTEMPTY) // т. е. ошибка, например из-за прав доступа, ENOTEMPTY - папка не пустая
          return false;
     _finddata_t find_info;
     
     char oldPath[MAX_PATH];
     _getcwd(oldPath,MAX_PATH);
     _chdir(path);

     intptr_t find_handle = _findfirst("*",&find_info);
     if (find_handle == -1) // не можем прочитать папку
     {
          _chdir(oldPath);
          return false;
     }

     do
    {
        if (find_info.name[0] != '.')
        {
            if (find_info.attrib & _A_SUBDIR)
            {
               if (!RemoveDir(find_info.name))
               {
                   _chdir(oldPath);
                   _findclose(find_handle);
                   return false;
               }
            }
            else
            {
               if (remove(find_info.name) != 0)
               {
                   _chdir(oldPath);
                   _findclose(find_handle);
                   return false;
               }
            }
         }
     } while (_findnext(find_handle,&find_info) == 0);

     _findclose(find_handle);
     _chdir(oldPath);

    if (_rmdir(path) != 0)
        return false;
                    
    return true;
}
 

Автор: papam 15.5.2006, 21:15
Компилятор  ругается:
'intprt_t' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'find_handle'
error C2065: 'find_handle' : undeclared identifier


 

Автор: bsa 15.5.2006, 22:07
papam
Почитай инструкцию на findfirst и поправь. За тебя программы писать никто не будет. 

Автор: Любитель 17.5.2006, 13:04
Компилер старый. Поставь вместо intptr_t long. 

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