Bạn muốn viết một hàm (một hàm đệ quy là dễ nhất, nhưng có thể dễ dàng chạy ra khỏi không gian ngăn xếp trên các thư mục sâu) liệt kê các con của một thư mục. Nếu bạn tìm thấy một đứa trẻ đó là một thư mục, bạn recurse trên đó. Nếu không, bạn xóa các tập tin bên trong. Khi bạn hoàn thành, thư mục trống và bạn có thể xóa nó qua syscall.
Để liệt kê các thư mục trên Unix, bạn có thể sử dụng opendir
, readdir
và closedir
. Để xóa bạn sử dụng rmdir()
trên một thư mục trống (ví dụ: ở cuối chức năng của bạn, sau khi xóa các trẻ em) và unlink()
trên một tệp. Lưu ý rằng trên nhiều hệ thống, thành viên d_type
trong struct dirent
không được hỗ trợ; trên các nền tảng này, bạn sẽ phải sử dụng stat()
và S_ISDIR(stat.st_mode)
để xác định xem đường dẫn cụ thể có phải là một thư mục hay không.
Trên Windows, bạn sẽ sử dụng FindFirstFile()
/FindNextFile()
để liệt kê, RemoveDirectory()
trên các thư mục trống và DeleteFile()
để xóa tệp.
Dưới đây là một ví dụ mà có thể làm việc trên Unix (hoàn toàn chưa được kiểm tra):
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;
}
Mọi người sẽ downvote một câu hỏi mà họ không tìm thấy rõ ràng hoặc hữu ích. Vì câu hỏi của bạn dường như đủ rõ ràng, tôi đoán ai đó (không phải tôi) không thấy nó hữu ích. – Manuel
Không có ngôn ngữ nào như C/C++ –
Có lẽ nó đã bị bỏ qua vì câu hỏi đã được hỏi ở đây nhiều lần trước đây, ví dụ: http://stackoverflow.com/questions/1149764/delete-folder-with-items và mọi người bị bệnh khi nhìn thấy nó? Downvoter không phải là tôi, BTW. –