Windows递归删除目录下所有文件-C实现

来源:互联网 发布:网络教育没有初中毕业 编辑:程序博客网 时间:2024/06/01 22:20

如有转载,请注明出处:http://blog.csdn.net/embedded_sky

作者:super_bert@csdn

Windows下删除制定文件夹下所有文件,如有目录则递归删除子目录下的文件。

网上找了一下,Windows下删除文件的API有libc库里的remove(),删除文件夹有rmdir(),但rmdir()不能删除子目录。如不考虑程序安全性,可以直接使用system+dos命令:

rmdir  C:/super_bert/test/  /q /s

若不用dos命令,就只有自己动手了。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <io.h>#include <direct.h>#include <errno.h>//判断是否是".."目录和"."目录inline bool is_special_dir(const char *path){    return strcmp(path, "..") == 0 || strcmp(path, ".") == 0;}//判断文件属性是目录还是文件inline bool is_dir(int attrib){    return attrib == 16 || attrib == 18 || attrib == 20;}//显示删除失败原因inline void show_error(const char *file_name = NULL){    errno_t err;    _get_errno(&err);    switch(err)    {        case ENOTEMPTY:            printf("Given path is not a directory, the directory is not empty, or the directory is either the current working directory or the root directory.\n");            break;        case ENOENT:            printf("Path is invalid.\n");            break;        case EACCES:               printf("%s had been opend by some application, can't delete.\n", file_name);            break;    }}inline void get_file_path(const char *path, const char *file_name, char *file_path){    strcpy_s(file_path, sizeof(char) * _MAX_PATH, path);    file_path[strlen(file_path) - 1] = '\0';    strcat_s(file_path, sizeof(char) * _MAX_PATH, file_name);    strcat_s(file_path, sizeof(char) * _MAX_PATH, "\\*");}//递归搜索目录中文件并删除inline void delete_file(char *path){    _finddata_t dir_info;    _finddata_t file_info;    intptr_t f_handle;    char tmp_path[_MAX_PATH];    if((f_handle = _findfirst(path, &dir_info)) != -1)    {        while(_findnext(f_handle, &file_info) == 0)        {            if(is_special_dir(file_info.name)){                continue;}            if(is_dir(file_info.attrib))//如果是目录,生成完整的路径            {                   get_file_path(path, file_info.name, tmp_path);                delete_file(tmp_path);//开始递归删除目录中的内容                tmp_path[strlen(tmp_path) - 2] = '\0';                if(file_info.attrib == 20)                    printf("This is system file, can't delete!\n");                else                {                    //删除空目录,必须在递归返回前调用_findclose,否则无法删除目录                    if(_rmdir(tmp_path) == -1)                    {                        show_error();//目录非空则会显示出错原因                    }                }            }            else            {                strcpy_s(tmp_path, path);                tmp_path[strlen(tmp_path) - 1] = '\0';                strcat_s(tmp_path, file_info.name);//生成完整的文件路径                               if(remove(tmp_path) == -1)                {                    show_error(file_info.name);                }                           }        }        _findclose(f_handle);//关闭打开的文件句柄,并释放关联资源,否则无法删除空目录    }    else    {        show_error();//若路径不存在,显示错误信息    }return;}int main(int argc, char **argv){    delete_file("E:/test/super_bert/*");    system("pause");    return 0;}

0 0
原创粉丝点击