1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por Tiagomnh, 30 de Dezembro de 2008. (Respostas: 2; Visualizações: 1422)

  1. Tiagomnh

    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: 2 de Janeiro de 2009
  2. sportingdan

    sportingdan I'm cool cuz I Fold

    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(name1name2);        
    }

    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 argcchar **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")!=&& 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
     
  3. Tiagomnh

    Tiagomnh Power Member

    É isso mesmo! Muito obrigado ;).
     

Partilhar esta Página