Verzeichnis rekursiv löscen



  • Hallo Leute,

    hat mir jemand ein kleines beispiel wie man Ordner rekursiv löscht (also samt Unterordner und deren Inhalt) ?

    Hab schonmal folgendes Probiert, funktioniert aber nicht ganz.

    void del_dir_rec(char * deldir)
    {
    	DIR *dir;
    	struct dirent *ep;
    
            // Ordner öffnen
    	dir = opendir(deldir);
    
    	if(dir != NULL)
    	{
              // In Ordner wechseln
    	  chdir(deldir);
    
              // Erstes Element aus dem Ordner lesen
    	  ep = readdir(dir);
    	  while(ep != NULL)
    	  {
    		struct stat st;
    		int Dateityp;
    
                    // neuen Pfad für evtl. rekursiven aufruf erstellen
    		char new_dir[250]="";
    		strcpy(new_dir,deldir);
    		strcat(new_dir,"\\");
    		strcat(new_dir,ep->d_name);
    
                    // Dateityp bestimmen
    		stat(ep->d_name, &st);
    		Dateityp = st.st_mode & S_IFMT;
    
    		switch (Dateityp) 
    		{
                                            // Falls Ordner dann sich selbst aufrufen
    					case S_IFDIR: 
    						del_dir_rec(new_dir); 
    						break;
                                            // Falls kein Ordner, dann sofort löschen
    					default: 
    						unlink(ep->d_name);
    						printf( "Datei : \"%s\" wurde gelöscht !!\n", ep->d_name);
    						break;
    		}
    
                    // Nächstes Element auslesen
    		ep = readdir(dir);
    	  }
    
              // Ordner schließen
    	  closedir(dir);
              // Eine Ebene höher wechseln
    	  chdir("../");
              // Jetzt leeren Ordner löschen
    	  rmdir(deldir);
    
    	  printf( ""Ordner : \"%s\" wurde gelöscht !!\n", deldir);
    	}
    	else
    	{
    		printf( ""Konnte Verzeichnis \"%s\" nicht löschen!!\n", deldir);
    		printf( "" --> (%s)\n", strerror(errno));
    	}
    }
    

    Die Funktion bekommt eine Zeichenkette mit dem zu löschenden Ordnernamen übergeben und dursucht den Ordner nach Unterordnern, wenn einer gefunden wird dann ruft sich die funktion selbst mit dem neuen Ordnernamen auf. Wenn es kein Ordner ist, dann wird es gelöscht.

    Compilerfehler:
    keine

    Laufzeitfehler:
    Habe der Funktion beim Test einen relativen Ordner übergeben, das: "Neuer Ordner"
    In dem Ordner sind Unterordner und Dateien. Die Funktion hat mir Zwar Dateien gelöscht, aber keine Inerhalb des Ordners sondern wahllos auf der Festplatte.

    Hat mir dazu jemand ne erklärung ?

    Thx



  • Also hab schonmal einen Fehler beseitigt.

    Das unkontrolliert lag daran, dass die funktion sich auch für "." und ".." aufgerufen hat.

    also statt das:

    ep = readdir(dir);
          while(ep != NULL)
          {
            struct stat st;
            int Dateityp;
    

    das:

    ep = readdir(dir);
    	  while(ep != NULL)
    	  {
    		  if ( !strcmp(ep->d_name,".") || !strcmp(ep->d_name,"..") )
    		  {
    			  ep = readdir(dir);
    			  continue;
    		  }
    
    		struct stat st;
    		int Dateityp;
    

    Geht jetzt auch. Allerdings nur mit absoluten Pfadangaben.

    Hat jemand ne Idee wie man das auch noch für relative implementiert ?

    Thx



  • Hi!

    Seh ich das falsch oder willst du die Funktion nicht aufrufen wenn es sich um "." oder ".." handelt. strcmp( a, b ) ist nämlich 0 wenn beide Zeichenketten gleich sind.

    char *path = "..";
    
    if ( !strcmp( path, ".." ) )
      printf( "gleich\n" );
    

    Irgendwie kann das nich so funktionieren wie du das da schilderst! 🙂

    grüße



  • Ja, sie soll sich nicht selbst aufrufen wenn es . oder .. ist und das macht sie ja auch nicht.

    wenn !strcmp(ep->d_name,".") dann continue; Was bedeutet das die schleife wiedeerholt wird ud auf das nächste element gesprungen wird (z.B. "..") aber sich die funktion nicht selbst aufruft.



  • Hi!

    Oh, sorry. Das hab ich übersehen! 🙂

    grüße



  • Das hilft mir aber nicht weiter. 🙂

    Irgendne Idee wie ich das auch für relative Pfade hinbekomme ?


Anmelden zum Antworten