2010-07-06 6 views
9

Sto scrivendo un programma C++ su Linux (Ubuntu). Vorrei eliminare il contenuto di un directory. può essere i file sciolti o sub-directory.Come cancellare il contenuto della directory in C++ su Linux (in pratica, voglio fare 'rm -rf <directorypath>/*'

in sostanza, mi piacerebbe fare qualcosa di equivalente a

rm -rf <path-to-directory>/* 

Potete suggerire il modo migliore di fare questo in C++ con le intestazioni richieste. E 'possibile farlo con sys/stat.h o sys/types.h o sys/dir.h?!

risposta

-2
system ("rm -rf <path-to-directory>"); 
+1

grande enorme gigante rischio per la sicurezza – sehe

+1

Questo non è un rischio per la sicurezza, non più della domanda. OP ha chiesto l'equivalente di 'rm -rf /*' che è praticamente questo (a parte il fatto che rimuoverà anche la directory di primo livello). – paxdiablo

+0

Appena imbattuto in questo post. Perché questo è un rischio per la sicurezza? – Laz

28

Utilizzare la funzione nftw() (File Albero a piedi), con la bandiera FTW_DEPTH. Fornire un callback che chiama semplicemente remove() sul file passato:

#define _XOPEN_SOURCE 500 
#include <stdio.h> 
#include <ftw.h> 
#include <unistd.h> 

int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) 
{ 
    int rv = remove(fpath); 

    if (rv) 
     perror(fpath); 

    return rv; 
} 

int rmrf(char *path) 
{ 
    return nftw(path, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); 
} 

Se non si desidera rimuovere la directory di base stessa, modificare la funzione unlink_cb() per controllare il livello:

int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) 
{ 
    int rv; 

    if (ftwbuf->level == 0) 
     return 0; 

    rv = remove(fpath); 

    if (rv) 
     perror(fpath); 

    return rv; 
} 
+2

È inoltre necessario aggiungere il flag FTW_PHYS per gestire correttamente i collegamenti simbolici (ovvero non seguirli). – divegeek

+0

@divegeek: concordato, modificato. – caf

+0

Cosa interpreta il ruolo di "-f" in questo codice? Cosa succede se si desidera un normale "rm -r"? –

Problemi correlati