ganzen ordner löschen



  • hallo, ich würde gerne ein programm schreiben,
    welches den inhalt eines verzeichnisses ausliest
    diesen inhalt mit einer while schleife löscht
    und dann erst den ordner selbst löscht(muss nicht unbedingt sein)

    hab es schon mit readdir und remove versucht,
    komme aber damit irgenwie nicht zurecht

    könnte mir jemand ein beispielprogramm geben?

    MFG
    uncannysnake


  • Mod

    Welches Betriebssystem? Und ohne etwas mehr Eigeninitiative wird es erfahrungsgemäß auch schwer, jemanden zu einem "Beispielprogramm" (Forensprech für: Mach meine Arbeit!) zu überreden.



  • Windoof: SHFileOperation( ... ) angucken



  • Swordfish schrieb:

    Windoof: SHFileOperation( ... ) angucken

    Wieso keine POSIX-Empfehlung?



  • Weil ich wett', dass op es für Windoof will ...



  • Der Hinweis auf readdir und remove lässt anderes vermuten.

    Ich denke mir das etwa so:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <unistd.h>
    
    #include <stdio.h>
    #include <string.h>
    
    void rmtree(char const *path) {
      DIR           *dir;
      struct dirent *file;
    
      dir = opendir(path);
      if(dir == NULL) return;
    
      while(NULL != (file = readdir(dir))) {
        char fullpath[NAME_MAX + 1];
        struct stat st_buf;
    
        if(strcmp(file->d_name, "." ) == 0 ||
           strcmp(file->d_name, "..") == 0)
        {
          continue;
        }
    
        snprintf(fullpath, NAME_MAX + 1, "%s/%s", path, file->d_name);
    
        if(0 == lstat(fullpath, &st_buf) && S_ISDIR(st_buf.st_mode)) {
          rmtree(fullpath);
        } else {
          remove(fullpath);
        }
      }
    
      closedir(dir);
      remove(path);
    }
    

    Bitte nur mit Verzeichnissen ausprobieren, die du nicht mehr brauchst! Eine sinnvolle Fehlerbehandlung darfst du dir selbst ausdenken.



  • Nachtrag: Es gäb da noch was einfacheres:

    #define _XOPEN_SOURCE 500
    #include <ftw.h>
    #include <stdio.h>
    
    int remove_file(char        const *fpath,
                    struct stat const *sb,
                    int                typeflag,
                    struct FTW        *ftwbuf) {
      /* Compilerwarnungen über unbenutzte Parameter unterdrücken */
      (void) sb;
      (void) typeflag;
      (void) ftwbuf;
    
      remove(fpath);
      return 0;
    }
    
    void rmtree(char const *path) {
      nftw(path, remove_file, 32, FTW_DEPTH | FTW_PHYS);
    }
    


  • vielen dank,
    habe es nicht angegeben,
    da ich ich das programm auf allen meinen Betriebssystemen
    zum laufen bringen will...

    danke seldon, werde es gleich ausprobieren und schauen,
    ob ich es an meine eigenen, speziellen bedürfnissse anpassen kann 😉

    MFG
    uncannysnake


  • Mod

    uncannysnake schrieb:

    vielen dank,
    habe es nicht angegeben,
    da ich ich das programm auf allen meinen Betriebssystemen
    zum laufen bringen will...

    Hmm, schwierig. Da musst du dir vielleicht eine Wrapperfunktion schreiben, die dann intern mit viel ifdef & Co den passenden Code erzeugt. Oder eine fertige Bibliothek nehmen, die das schon für einen erledigt hat. Fallt mir für C spontan nichts ein. Falls C++ ok ist, könnte man boost::filesystem dafür nehmen.




Anmelden zum Antworten