c - C - 在递归函数中 remove() 不起作用
问题描述
当我在目录 Folder/file.txt 上调用函数时,避免递归函数是否构造良好。这段代码应该删除 file.txt,但是当它到达
if (remove(actual->d_name) != 0 && rmdir(actual->d_name) != 0){
删除不起作用,我不知道为什么......
void borrarrecursivo(DIR *directorio){
struct dirent *actual;
while(((actual = readdir(directorio)) != NULL) && (actual->d_name) != NULL){
if ((strcmp(actual->d_name, ".") != 0) && (strcmp(actual->d_name, "..") != 0)){
if (remove(actual->d_name) != 0 && rmdir(actual->d_name) != 0){
DIR *siguiente;
if ((siguiente = opendir(actual->d_name)) != NULL){
borrarrecursivo(siguiente);
}
}
}
}
closedir(directorio);
//}
}//fin borrarrecursivo
解决方案
阅读 上的手册页readdir
,它d_name
以文件名返回,而不是完整路径,而是remove
期望rmdir
完整路径(或相对于当前工作目录的条目)。
因此,每次对函数进行递归调用时,您都必须构建一条关于当前位置的新路径,并将其传递给递归调用。(我让你改变你的代码来实现这一点。)
注意:您还假设如果您既不能删除,也不能 rmdir,则它必须是一个目录并且您要递归。但它不必是目录。您应该检查该d_type
字段。
注意:remove 的手册页说,如果名称是目录,它会调用 rmdir。因此调用 rmdir 是不必要的。
推荐阅读
- r - 如何过滤多个条件
- validation - 在 react-native 中针对多个相同的单词验证电子邮件
- javascript - 如何使用ajax将多个点发送到php文件
- angular7 - 将角度元素包含到表达式引擎 cms 网站中
- laravel - 'return $next($request)' 在 Laravel 中间件中有什么作用?
- python - 如何将许多数据帧与日期时间索引和列连接起来?
- nativescript - Nativescript-Vue 每行两列
- user-interface - 在 Vaadin 应用程序中为 Link 创建的新页面添加按钮
- javascript - javascript中只有一个反斜杠
- java - OAuth2RestTemplate.postForEntity RestClientException:[org.x.xx] 和内容类型 [application/json] 没有 HttpMessageConverter