gpt4 book ai didi

c++ - 在 C 或 C++ 中以编程方式删除非空目录

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:54 24 4
gpt4 key购买 nike

如何在C或C++中删除非空目录?有什么功能吗? rmdir 只删除空目录。请提供一种不使用任何外部库的方法。

还告诉我如何用 C 或 C++ 删除文件?

最佳答案

您想编写一个函数(递归函数最简单,但很容易用完深层目录上的堆栈空间)来枚举目录的子项。如果您发现一个子目录是一个目录,那么您将对其进行递归。否则,你删除里面的文件。完成后,该目录为空,您可以通过系统调用将其删除。

要枚举 Unix 上的目录,您可以使用 opendir()readdir()closedir()。要删除您,请在空目录上使用 rmdir()(即在您的函数末尾,在删除子项之后)和在文件上使用 unlink()。请注意,在许多系统上,不支持 struct dirent 中的 d_type 成员;在这些平台上,您必须使用 stat()S_ISDIR(stat.st_mode) 来确定给定路径是否为目录。

在 Windows 上,您将使用 FindFirstFile()/FindNextFile() 枚举,在空目录上使用 RemoveDirectory(),以及 DeleteFile() 删除文件。

这是一个可能适用于 Unix 的示例(完全未经测试):

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

关于c++ - 在 C 或 C++ 中以编程方式删除非空目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43050647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com