zoukankan      html  css  js  c++  java
  • 根据CreateDirectory递归创建多级目录

    分为MFC下的和非MFC下的两种,MFC路径是CString类型的,非MFC的路径是wstring类型的。

    下面是MFC下的创建目录:

    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);  // 递归返回,在存在的目录上再建目录
        }// 多级目录创建成功
    }

    下面是非MFC的创建目录:

    void __fastcall RecursiveDirectory(wstring wstrDir) // 创建复目录
    {
        if (wstrDir.length() <= 3)//是根目录,无需创建目录
        {
            return;
        }
        if (wstrDir[wstrDir.length() - 1] == '\')   // 将路径改为目录
        {
            wstrDir.erase(wstrDir.end() - 1);
        }
        // 修改文件属性
        WIN32_FIND_DATA wfd;
        HANDLE hFind = FindFirstFile(wstrDir.c_str(), &wfd); // 查找
        if (hFind != INVALID_HANDLE_VALUE)
        {
            FindClose(hFind);
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                return;
        }
        // 创建当前目录的地目录失败
        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); // delete '\' 
            // 递归进入
            RecursiveDirectory(wstrNewDir);  // 递归本函数,再创建目录
            // 递归退出后创建之前失败的目录
            CreateDirectory(wstrDir.c_str(), NULL);  // 递归返回,在存在的目录上再建目录
        }// 多级目录创建成功
    }
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/Uthinker/p/5806464.html
Copyright © 2011-2022 走看看