递归创建、删除目录的几个函数

递归创建目录1:

需要#include <shlwapi.h>,并且配置好shlwapi.ib

BOOL CreateDirTree( LPCTSTR lpPath )
{
    if( NULL == lpPath || _tcslen(lpPath)==0 )
    {
        return FALSE;
    }

    if( ::PathFileExists( lpPath) || ::PathIsRoot(lpPath) )
        return TRUE;

    TCHAR szParentpath[MAX_PATH] = _T("");
    ::lstrcpy( szParentpath, lpPath );

    ::PathRemoveBackslash( szParentpath );//去除路径最后的反斜杠
    ::PathRemoveFileSpec( szParentpath );//将路径末尾的文件名或文件夹和反斜杠去掉

    if(0 == _tcscmp(lpPath, szParentpath))
        return FALSE;

    assert(0 != _tcscmp(lpPath, szParentpath));
    if( CreateDirTree( szParentpath) )//递归创建直到上一层存在或是根目录
    {
        return ::CreateDirectory(lpPath, NULL);
    }
    else
    {
        return FALSE;
    }

    return TRUE;
}

递归创建目录2:

void __fastcall RecursiveDirectory(CString cstrDir) // 递归创建目录
{
    if (cstrDir.GetLength() <= 3)//是根目录,无需创建目录
    {
        return;
    }
    if (cstrDir[cstrDir.GetLength()-1] == ‘\\‘)   // 将路径改为目录
    {
        cstrDir.Delete(cstrDir.GetLength()-1, 1);
    }
    // 修改文件属性
    WIN32_FIND_DATA wfd;
    HANDLE hFind = FindFirstFile(cstrDir, &wfd); // 查找
    if (hFind != INVALID_HANDLE_VALUE)
    {
        FindClose(hFind);
        if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            return;
    }
    // 创建当前目录的地目录失败
    if (CreateDirectory(cstrDir,NULL) == false)
    {// 退到上一级目录
        CString wstrNewDir = cstrDir;
        int n = wstrNewDir.ReverseFind(‘\\‘);
        wstrNewDir = cstrDir.Left(n);

        // 递归进入
        RecursiveDirectory(wstrNewDir);  // 递归本函数,再创建目录
        // 递归退出后创建之前失败的目录
        CreateDirectory(cstrDir,NULL);  // 递归返回,在存在的目录上再建目录
    }// 多级目录创建成功
}

递归创建目录3:

BOOL RecursiveDirectory(wstring wstrDir)
{
    if (wstrDir.length() <= 3)
    {
        return FALSE;
    }
    if (wstrDir[wstrDir.length() - 1] == ‘\\‘)
    {
        wstrDir.erase(wstrDir.end() - 1);
    }

    if (PathFileExists(wstrDir.c_str()))
        return TRUE;

    if (CreateDirectory(wstrDir.c_str(), NULL) == false)
    {
        wstring wstrNewDir = wstrDir;
        while (wstrNewDir[wstrNewDir.length() - 1] != ‘\\‘)
        {
            wstrNewDir.erase(wstrNewDir.length() - 1);
        }
        // delete ‘\\‘
        wstrNewDir.erase(wstrNewDir.length() - 1);

        RecursiveDirectory(wstrNewDir);
        CreateDirectory(wstrDir.c_str(), NULL);
    }

    if (!PathFileExists(wstrDir.c_str()))
        return FALSE;
    return TRUE;
}

递归创建目录4:

bool createDirectory(const char* pathName)
{
    char path[MAX_PATH];
    memset(path, 0x00, MAX_PATH);
    const char* pos = pathName;
    while ((pos = strchr(pos, ‘\\‘)) != NULL)
    {
        memcpy(path, pathName, pos - pathName + 1);
        pos++;
        if (_access(path, 0) == 0)
        {
            continue;
        }
        else
        {
            int ret = _mkdir(path);
            if (ret == -1)
            {
                return false;
            }
        }
    }
    return true;
}

递归删除目录1:

system("rmdir /s /q dirname");  //dirname是要删除的目录名称,这种方式,在使用MFC程序的时候出闪过一个CMD的窗口
/s是级联删除  /q 是不提示(在命令行下操作的话,如果不加这个开关,会有提示确认是否删除目录,而在程序中不允许停下)

递归删除目录2:

 SHFILEOPSTRUCT FileOp;
 FileOp.fFlags = FOF_NOCONFIRMATION;
 FileOp.hNameMappings = NULL;
 FileOp.hwnd = NULL;
 FileOp.lpszProgressTitle = NULL;
 FileOp.pFrom = ".\\tempDir";
 FileOp.pTo = NULL;
 FileOp.wFunc = FO_DELETE;
 SHFileOperation(&FileOp);

此处有一个地方要留心一下,就是FileOp.pFrom这个参数,它使用的字符串一定是要‘\0‘结尾的,这个地方使用".\\tempDir",这个字符串默认的结束字符就是‘\0‘,所以如果存在这个目录或者文件的话,一定可以将其删除,如果像下面这样写的话就会出错:

std::string delPath = ".\\tempDir";

FileOp.pFrom = delPath.c_str();  // 此时字符串没有以‘\0‘结尾,所以删除的时候会出错

递归删除目录3:

bool deleteDirectory( char* pathName)
{
    struct _finddata_t fData;
    memset(&fData, 0, sizeof(fData));

    if (_chdir(pathName) != 0) //_chdir函数设置当前目录
    {
        printf("chdir failed: %s\n",pathName);
        return false;
    }

    intptr_t hFile = _findfirst("*",&fData);  //参数1:char *类型,"*"表示通配符,可以查找文件、文件夹
    if(hFile == -1)
    {
        printf("_findfirst error!\n");
        return false;
    }

    do
    {
        if(fData.name[0] == ‘.‘)
            continue;
        if(fData.attrib == _A_SUBDIR) //子文件夹
        {

            char dirPath[MAX_PATH];
            memset(dirPath,0,sizeof(pathName));
            strcpy_s(dirPath,pathName);
            strcat_s(dirPath,"\\");
            strcat_s(dirPath,fData.name);

            deleteDirectory(dirPath);  //recursion subdir
            printf("remove dir: %s\n",dirPath);
            _chdir("..");
             _rmdir(dirPath);
        }
        else
        {
            char filePath[MAX_PATH];
            memset(filePath,0,sizeof(filePath));
            strcpy_s(filePath,pathName);
            strcat_s(filePath,"\\");
            strcat_s(filePath,fData.name);

            remove(filePath);
            printf("remove file: %s\n",filePath);
        }
    }while(_findnext(hFile,&fData) == 0);

    _findclose(hFile);  //close

    return true;
}

原文地址:https://www.cnblogs.com/eaglexmw/p/11193059.html

时间: 2024-08-06 11:16:10

递归创建、删除目录的几个函数的相关文章

利用php函数mkdir递归创建层级目录

项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而要逐层创建各级目录的话,一般都是先从父创建,然后逐层往下创建,但是这样手工创建的话,有点太过于麻烦了. 我们写程序是做什么的?不久是为了能自动化实现我们需要的功能么,这里的方法就是为了能够通过程序帮我们自动创建完成层级目录. Ruesin.com 思路有两种: 一.从上往下(父级→子级) 1.先判断

php中通过递归实现删除目录下的所有文件

(本文转载于:www.klsele.com.cn) php中通过递归实现删除目录下的所有文件.,有需要的朋友可以参考下. 最近遇到一个实际问题,需要清空制定目录下的所有文件及清空数据库.清空数据库不难,但要如何递归删除一个目录下的所有文件呢. 于是去网上研究了下资料再加上自己琢磨解决了这一问题. 先贴代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php function delFile($dirName){     if ($handl

二叉树的递归创建

1.树 (1).树形结构本身具有递归的性质(在其后的编程中体现的淋漓尽致)! 树是一种非常重要的非线性结构. (2).几个概念:结点的度,就是分支个数(孩子个数): 树的度,结点度中最大的(孩子最多的): 非叶子结点,度 > 0 (有孩子结点): 叶子结点,度为0的 (没有孩子结点): 树的高度,从1开始算: (3).为什么要学习二叉树? 原因:所有的树形结构(包括森林)都可以转化为二叉树.二叉树是树形结构的基础, 只有学好了二叉树才能学好其它的. 2.二叉树 (1).二叉树分左右,所以又叫做有

PHP递归创建多级目录(一道面试题的解题过程)

今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkdir($dir,0777)){ //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告. echo $dir."创建成功<br>"; //输出创建成功的目录 }else{ $dirArr=explode('/',$dir); /

C++递归创建文件夹

根据传入的参数递归进行目录的创建. 函数描述: 递归创建目录. 入参: 所要创建的目录. 返回值: 创建成功,返回TRUE:否则返回FALSE. 1 BOOL CreateDirTree(LPCTSTR lpPath) 2 { 3 if( (NULL == lpPath) || (0 == _tcslen(lpPath))) 4 { 5 return FALSE; 6 } 7 8 if((TRUE == PathFileExists(lpPath)) || (TRUE == PathIsRoot

Convert Sorted List to Binary Search Tree ------C++ 递归创建平衡二叉查找树

有序链表 0->1->2->3->4->5 转换为一个二叉排序树.我们在此创建一个平衡二叉排序树 1.先找链表到中间的节点 2.中间节点的val创建一个新的树节点TreeNode 3.将链表断裂为2部分 4.递归创建左子树和右子树 #include<iostream> #include<cstdlib> using namespace std; struct ListNode { int val; ListNode *next; ListNode(in

递归调用实例分析2.在函数中间的递归与在函数尾部的递归

上一篇最后给出了用递归完成字符串逆置的代码,但是没有分析它的具体算法,今天做了如'abcde'字符串递归翻转的图跟大家分享(画的比较烂,具体思路还是有的,详情见附件) 这里的递归调用没有出现在函数末尾,二前面几个递归都出现在函数末尾,所以说递归可以分为在函数末尾的递归与在函数中的递归.其差别如下. 1.在函数尾部的递归,都可以用循环的方式做下去,这样的递归大多数情况只能造成代码的简洁,并不利于机器的运算. 2.在函数中间的递归,不一定能用循环的方式做下去,这样的递归有的可以转化成在函数末尾的递归

递归创建二叉树遇到的一个bug

今天上午在(先序)递归创建二叉树时遇到了一个bug,以下是程序部分: (关于递归创建二叉树这位前辈讲的很清楚,http://blog.csdn.net/stpeace/article/details/8138303) 1 void PreTraverse(PBiNode T) 2 { 3 if(!T) 4 return; 5 printf("%c", T->data); 6 PreTraverse(T->leftch); 7 PreTraverse(T->rightc

SQLSERVER中WITH AS递归来实现ORACLE的INSTR函数以及固定分隔符字符串截取

分享个sqlserver的sql给大家,能用with as的递归实现oracle中的instr函数,并且能将分隔符的字符串解析,例如: 字符串为:'O3O,30,4834,348934,AA,09WOFJOWE,FW' 解析完成: 1)实现oracle的instr函数,sql如下: WITH CTE1 AS ( SELECT '1' AS ID , 'O3O,30,4834,348934,AA,09WOFJOWE,FW' AS STR ), CTE2 AS ( SELECT 1 AS LEVEL