[Resolvido] C - apagar conteúdo de uma directoria

Tiagomnh

Power Member
Preciso de apagar o conteúdo de uma pasta (não é a pasta onde o executável está). Para tal ocorreu-me utilizar uma função da família "exec" para fazer um "rm /home/user/coisas/*" mas não estou a conseguir. Quando experimento execlp("rm","rm","/home/user/coisas/*",NULL) isto tenta remover um ficheiro ou pasta chamado "/home/user/coisas/*" ao contrário de remover tudo o que está na directoria "/home/user/coisas" como eu pretendia.

Alguém tem alguma sugestão? Thanks in advance ;).
 
Última edição:
tens de usar a dirent.h :P

PHP:
  DIR *folder;
  struct dirent *info_dir;
  
  folder=opendir(directorio);

  while(info_dir=readdir(folder))
    ++k;

  k=0;
  while(info_dir=readdir(dfile))
    {
       nome[k]=info_dir->d_name;
       ++k;
    }

depois de teres os nomes de todos os ficheiros que estão dentro da pasta é só usar a função remove nos ficheiros todos (atenção ao "." e ".." :P) e por fim na própria pasta :)

agora, o problema é quando tens subpastas não vazias dentro da pasta que queres apagar, e assim sucessivamente :007:

vê esta página, pareceu-me ter alguma coisa que se aproveitasse:
http://www.kpsforum.com/rss-news/16228-recursive-function-problem-remove-directory-c.html

deixo-te também o código de uma implementação da função DIR(win32)/LS(unix) que te pode ajudar a compreender os mecanismos necessários para mexer com ficheiros e directorias.

PHP:
/*DIR/LS CMD UTILITY por Daniel Salvador aka sportingdan - MEFT08*/
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>

typedef struct
{
  char *sname;
  unsigned long int tam;
  long int dat;
  unsigned char foldertest;    
} ficheiro;

int
compare (const void *info1, const void *info2)
{
  ficheiro **arch1 = (ficheiro**) info1;
  ficheiro **arch2 = (ficheiro**) info2;
  
  char *name1 = (*arch1)->sname;
  char *name2 = (*arch2)->sname;
  
  return strcasecmp(name1, name2);        
}

void
show_help (int status)
{
  printf ("\n_-^*+DIR/LS CMD UTILITY(\?!)+*^-_\n");          
  printf ("\n*AJUDA*\n");  
  printf ("\n-Para obter listagem de objectos da pasta onde\n se encontra");
  printf (" o programa:\n  > prog\n");  
  printf ("\n-Para obter listagem detalhada de objectos da pasta onde\n");
  printf (" se encontra o programa:\n  > prog -l\n");
  printf ("\n-Para obter listagem de objectos de outra pasta:\n");
  printf ("  > prog <localizacao directorio>\n");
  printf ("\n-Para obter listagem detalhada de objectos de outra pasta:\n");
  printf ("  > prog -l <localizacao directorio>\n");
  printf ("\n-Para mostrar esta informacao: prog -help\n\n");
  printf("NOTA: Se a localizacao da pasta contiver espacos,\n");
  printf("entao e necessario incluir aspas. Exemplo:\n");
  printf(">prog -l \"<localizacao directorio>\"\n\n");
  
  exit (status);
}

int
main(int argc, char **argv)
{
  DIR *dfile,*dtest;
  ficheiro **fich;
  char *name;
  char *chpto=".";
  char *ptdir;
  int k=0;
  int ls=0;
  int num,t;
  struct dirent *info_dir;
  struct stat info_file;
  struct tm *ptr_tm;
  char mtime[50];
  
  if(argc==1)
    ptdir=chpto;
  else if(argc==2)
    {
      if(strcmp(argv[1],"-l")!=0 && strcmp(argv[1],"-help")!=0)
        ptdir=argv[1];
      else if(strcmp(argv[1],"-help")==0)
        show_help (1);
      else      
        {
          ls=1;
          ptdir=chpto;
        }              
    }
  else if(argc==3)
    {
      if(strcmp(argv[1],"-l")!=0)
        {
          printf("\nERRO! - Opcao invalida.\n");
          show_help (-1);
        }             
      ls=1;
      ptdir=argv[2];
    }
  else
    {
      printf("\nERRO! - Opcao invalida.\n");
      show_help (-2);
    }  
  
  dfile=opendir(ptdir);
  if(dfile==0)
    {
      printf("\nERRO! - Nao foi possivel abrir a pasta especificada.\n");
      printf("Por vafor verifique a questao dos espacos!\n");
      show_help (-3);
    }
 
  while(info_dir=readdir(dfile))
    ++k;  
  num=k;  
  fich=(ficheiro**)malloc(num*sizeof(ficheiro*));
   
  closedir(dfile);
  
  dfile=opendir(ptdir);  
  
  k=0;
  while(info_dir=readdir(dfile))
    {
      fich[k]=(ficheiro*)malloc(sizeof(ficheiro));
      fich[k]->sname=(char*)malloc((strlen(info_dir->d_name)+1)*sizeof(char));
      strcpy(fich[k]->sname,info_dir->d_name);
     
      if(ls==1)
        { 
          t=strlen(ptdir)+strlen(info_dir->d_name)+2;
          name=(char*)malloc(t*sizeof(char));
          strcpy(name,ptdir);
    
          #ifndef __unix__ 
          strcat(name,"\\");        
          #else          
          strcat(name,"/");;
          #endif
  
          strcat(name,info_dir->d_name);
          
          #ifndef __unix__
          stat(name,&info_file);
          #else
          lstat(name,&info_file);
          #endif
          
          fich[k]->tam=info_file.st_size;
          fich[k]->dat=info_file.st_mtime;
          
          dtest=opendir(name);
          if(dtest==NULL)
            fich[k]->foldertest=0;
          else
            fich[k]->foldertest=1;
          closedir(dtest);        
        } 
      ++k;  
    }

  qsort(fich,num,sizeof(*fich),compare);
  
  printf("\n_-^*+DIR/LS CMD UTILITY(\?!)+*^-_\n\n");  
  printf("\n*FOLDER CONTENT\n\n");  
  for(k=0;k<num;++k)
    {
      printf("%s\n",fich[k]->sname);
      if(ls==1)
        {
          ptr_tm=localtime(&fich[k]->dat);
          strftime(mtime,sizeof(mtime),"%a, %d/%m/%y at %H:%M:%S",ptr_tm);
          if(fich[k]->foldertest==0)
            printf("Type:File -- Size:%lu bytes",fich[k]->tam);
          else
            printf("Type:Folder");
          printf(" -- Date Modified: %s\n\n",mtime);
        }
    }
  closedir(dfile);
  return 0;          
}

cumps
 
Back
Topo