[C] Cancellare una directory piena

di il
4 risposte

[C] Cancellare una directory piena

Salve sono nuovo del forum, quindi un saluto a tutti!

Vorrei sapere come si fa a cancellare una directory piena in un programma scritto in C; vi scrivo come avrei pensato di fare (ma ovviamente questa soluzione non funziona):
DIR *dp;
struct dirent *ep;

dp = opendir ("nome-directory");
if (dp != NULL) {
      while (ep = readdir (dp))
            unlink (ep -> d_name);
      (void) closedir(dp);
}
else
      perror ("ERRORE");

Vi ringrazio

4 Risposte

  • Re: [C] Cancellare una directory piena

    In DOS rmdir rimuove una directory vuota, rmdir /s cancella tutti i file e sottocartelle inclusa la cartella specificata, tipo:
    RMDIR /S C:\Ciaociao
    REM Elimina la cartella Ciaociao, i file e le sottocartelle
  • Re: [C] Cancellare una directory piena

    Ciao,
    la logica é corretta ma dovrebbe essere una funzione ricorsiva (lstat check S_ISDIR) testando anche che non sia la corrente o precedente (punto, puntopunto).
    Scrivi qualcosa di + completo ed eventualmente riposta il codice

    @ale: qui siamo in posix
  • Re: [C] Cancellare una directory piena

    Mmm puoi spiegarti meglio? Di quale parte del codice hai bisogno?
  • Re: [C] Cancellare una directory piena

    Stiamo parlando di POSIX vero?
    Chiedevo un giro di codice ricorsivo per leggere eventuali sottodirectory.
    La scoperta dell'acqua calda consiste nel richiamare la stessa funzione di scorrimento, solo quando incontriamo una subdirectory. Se non usiamo la ricorsione ci rendiamo la vita impossibile.
    Provala e cambia macro REMOVE
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <dirent.h>
    
    #define REMOVE(x) printf("unlink (\"%s\")\n",x)
    int rm_rf (const char *path)
    {
      struct dirent *entry;
      DIR *dp;
      struct stat sb;
      char *pathname;
    	
      if ((dp = opendir(path))==NULL)
      {
    	perror("opendir");
    	return -1;
      }
      
      while((entry = readdir(dp)))
      {
    	/** 
    	 * Alcuni sistemi leggono la directory corrente (.) e la precedente (..)
    	 * e a noi non frega un fico secco trattarle
    	 */
    	if (strncmp(entry->d_name,".",1) && strncmp(entry->d_name,"..",2))
    	{
    	  /** 
    	   * Ci creiamo il pathname per la stat
    	   */
    	  if ((pathname=malloc (strlen(path)+strlen(entry->d_name)+2))==NULL)
    	  {
    		perror("malloc");
    		return -1;
    	  }
    	  sprintf (pathname,"%s/%s",path,entry->d_name);
    	  stat(pathname, &sb);
    
    	  /** 
    	   * Se e' una directory usiamo la ricursione
    	   */
    	  if ((sb.st_mode & S_IFMT)==S_IFDIR)
    		rm_rf (pathname);
    	
    	  /** macro per fare quello che vogliamo */
    	  REMOVE(pathname);
    	  
    	  /** dealloca il pathname */
    	  free (pathname);
    	}
      }
      
      closedir(dp);
      return 0;
    }
    int main (int argc, char **argv)
    {
      if (argc<2)
    	rm_rf (".");
      else
    	rm_rf (argv[1]);
      return 0;
    }   
    
Devi accedere o registrarti per scrivere nel forum
4 risposte