001
04.01.2007, 13:02 Uhr
virtual
Sexiest Bit alive (Operator)
|
Nein,
ordner löscht man mit dem befehl rmdir (man 2 rmdir), Dies geht schief, wenn der ordner nicht leer ist. daher würde man zunächst den Inhalt des Ordners löschen. Man kann es zB so machen:
C++: |
#include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <dirent.h> #include <strings.h>
int delete_file_or_dir(const char* path) { static struct stat info; char buffer[PATH_MAX]; int unlink_err; struct dirent** entries; int entry_count; int i;
/* Firstly simply try an unlink. If it not works, we have examine the cause */ if (0 == unlink(path)) { return 0; } unlink_err = errno;
/* Get information about file */ if (0 != stat(path, &info)) { perror("stat"); return -1; }
/* If it is no0 directory, the prev. unlink had to work. */ if (!S_ISDIR(info.st_mode)) { errno = unlink_err; perror("unlink"); return -1; }
/* If we are here, it is for sure a directory, delete its entries. */ entry_count = scandir(path, &entries, NULL, alphasort); if (entry_count<0) { perror("scandir"); return -1; }
for(i=0; i<entry_count; ++i) { if (0==strcmp(entries[i]->d_name, ".") || 0==strcmp(entries[i]->d_name, "..")) { continue; } strcpy(buffer, path); strcat(buffer, "/"); strcat(buffer, entries[i]->d_name);
if (0 != delete_file_or_dir(buffer)) { free(entries); return -1; } }
/* Cleanup */ free(entries);
/* Delete the empty directory. */ if (0 != rmdir(path)) { perror("rmdir"); return -1; }
return 0; }
|
Wesentlich ist dabei, daß´die Funktion rekursiv arbeitet: Findet man im Verzsichnis also ein unterverzeichnis, ruft sie sich dafür selbst nochmals auf.
Vorsicht: Die Funktion macht de facto ein rm -rf ! -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |