Chcesz napisać funkcję (funkcja rekursywna jest najłatwiejsza, ale może łatwo zabraknąć miejsca na stosie w głębokich katalogach), która wyliczy dzieci katalogu. Jeśli znajdziesz dziecko, które jest katalogiem, powtarzasz to. W przeciwnym razie usuniesz pliki wewnątrz. Kiedy skończysz, katalog jest pusty i możesz go usunąć przez syscall.
Aby wyliczyć katalogi w systemie Unix, można użyć opendir
, readdir
i closedir
. Aby usunąć, użyj rmdir()
w pustym katalogu (tj. Na końcu swojej funkcji, po usunięciu potomków) i unlink()
w pliku. Należy zauważyć, że w wielu systemach element d_type
w struct dirent
nie jest obsługiwany; na tych platformach będziesz musiał użyć stat()
i S_ISDIR(stat.st_mode)
, aby określić, czy dana ścieżka jest katalogiem.
W systemie Windows można użyć FindFirstFile()
/FindNextFile()
wyliczyć, RemoveDirectory()
na pustych katalogów i DeleteFile()
usunąć pliki.
Oto przykład, który może pracować na systemie Unix (całkowicie niesprawdzonych):
int remove_directory(const char *path)
{
DIR *d = opendir(path);
size_t path_len = strlen(path);
int r = -1;
if (d)
{
struct dirent *p;
r = 0;
while (!r && (p=readdir(d)))
{
int r2 = -1;
char *buf;
size_t len;
/* Skip the names "." and ".." as we don't want to recurse on them. */
if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, ".."))
{
continue;
}
len = path_len + strlen(p->d_name) + 2;
buf = malloc(len);
if (buf)
{
struct stat statbuf;
snprintf(buf, len, "%s/%s", path, p->d_name);
if (!stat(buf, &statbuf))
{
if (S_ISDIR(statbuf.st_mode))
{
r2 = remove_directory(buf);
}
else
{
r2 = unlink(buf);
}
}
free(buf);
}
r = r2;
}
closedir(d);
}
if (!r)
{
r = rmdir(path);
}
return r;
}
Ludzie downvote pytanie nie znajdą jasne lub użyteczne. Ponieważ twoje pytanie wydaje się wystarczająco jasne, sądzę, że ktoś (nie ja) nie uznał tego za przydatny. – Manuel
Nie ma takiego języka, jak C/C++ –
Być może został odrzucony, ponieważ pytanie zostało zadane tutaj wiele razy wcześniej, na przykład http://stackoverflow.com/questions/1149764/delete-folder-with-items, a ludzie masz dość widzenia? Downvoter to nie ja, BTW. –