zoukankan      html  css  js  c++  java
  • 递归创建、删除目录的几个函数

    递归创建目录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这个参数,它使用的字符串一定是要''结尾的,这个地方使用".\tempDir",这个字符串默认的结束字符就是'',所以如果存在这个目录或者文件的话,一定可以将其删除,如果像下面这样写的话就会出错:

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

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

    递归删除目录3:

    bool deleteDirectory( char* pathName)
    {
        struct _finddata_t fData;
        memset(&fData, 0, sizeof(fData));
     
        if (_chdir(pathName) != 0) //_chdir函数设置当前目录
        {
            printf("chdir failed: %s
    ",pathName);
            return false;
        }
     
        intptr_t hFile = _findfirst("*",&fData);  //参数1:char *类型,"*"表示通配符,可以查找文件、文件夹
        if(hFile == -1)
        {
            printf("_findfirst error!
    ");
            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
    ",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
    ",filePath);
            }
        }while(_findnext(hFile,&fData) == 0);
     
        _findclose(hFile);  //close
     
        return true;
    }
  • 相关阅读:
    身份证验证(c#和js)
    获取焦点问题
    关于加载设计器遇到一个或多个错误问题的解决方案
    关于如何使用自定义的结束消息循环的方式 (转载)
    多种重要源码下载
    关于线程同步(转载)
    ArrayList的使用技巧
    一些所谓有利于家庭生活的优点
    080801 30℃
    080731 31℃
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11193059.html
Copyright © 2011-2022 走看看