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;
}