我正在尝试从我的命令行解释器中删除所有文件和子目录。当调用 rmdir -s newFolder 时,我调用了一个函数 removeAll,它遍历所有文件和子文件夹并删除所有文件。
例如,如果我想删除文件 newFolder,我删除所有文件并进入 newFolder1。我删除 newFolder1 中的所有文件并进入 newFolder2 并删除所有文件。所以现在我在 newFolder 2 中,newFolder、newFolder1 和 newFolder2 是空的。
我的问题是如何递归备份并删除这 3 个空文件夹。我已经调试并为此工作了几个小时,但我就是不明白。谢谢
这个函数会成功删除一个空文件夹,否则调用removeAll。
void MyShell::rmdir () {
//Error Check
if(argc != 3) {
printf("USAGE: rmdir [-s] <directory>\n");
return;
}
else if(stricmp(cwd, argv[2]) == 0){
printf("Cannot remove the current working directory");
return;
}
if(_rmdir(argv[2]) == 0)
return;
removeAll(argv[2]);
}
函数 removeAll 成功删除所有子文件夹中的所有文件
void removeAll(char *path)
{
_chdir(path);
_finddata_t data;
intptr_t handle = _findfirst("*", &data);
if(handle == -1)
{
return;
}
do
{
if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0)
{
continue;
}
remove(data.name);
if(data.attrib & _A_SUBDIR)
{
removeAll(data.name);
}
} while(_findnext(handle, &data) != -1);
_findclose(handle);
}
我递归备份和删除所有子文件夹的想法是在从 findnext 循环中断后调用一个方法
void removeDirectory(char *path)
{
_finddata_t data;
intptr_t handle = _findfirst("*", &data);
if(handle == -1)
{
return;
}
do
{
if (strcmp(data.name, ".") == 0 || strcmp(data.name, "..") == 0)
{
continue;
}
if(data.attrib & _A_SUBDIR)
{
if(_rmdir(data.name) == 0)
{
_chdir("..");
removeDirectory(path);
}
}
} while(_findnext(handle, &data) != -1);
_findclose(handle);
}