创建目录

/*
功能:创建多级目录
参数:dir必须是绝对路径
调用:
    char dir[] = "E:\\Demo\\Folder\\subFolder\\my2\\test.png";
    char dir[] = "E:\\Demo\\Folder\\subFolder\\my2\\";
    char dir[] = "E:\\Demo\\Folder\\subFolder\\my2";
    CreateDir(dir);
*/
void CreateDir(const char *dir)
{
    int m = 0, n;
    string str1, str2;

    str1 = dir;
    str2 = str1.substr(0, 2);
    str1 = str1.substr(3, str1.size());

    while (m >= 0)
    {
        m = str1.find('\\');

        str2 += '\\' + str1.substr(0, m);
        n = _access(str2.c_str(), 0); //判断该目录是否存在
        if (n == -1)
        {
            _mkdir(str2.c_str());     //创建目录
        }

        str1 = str1.substr(m + 1, str1.size());
    }
}

    //char dir[] = "E:\\Demo\\Folder\\subFolder\\my2";
    //CreateDir(dir);
    //_mkdir(".\\123\\abc"); // 无法创建多级

    //char dir[] = ".\\123a\\123b"; // 在当前目录下创建123a目录
    //char dir[] = ".\\123a\\123b\\"; // 在当前目录下创建123a\\123b目录
    //char dir[] = "124a"; // 没创建目录
    //char dir[] = "124a\\"; // 在当前目录下创建124a目录
    char dir[] = ".\\123a\\123b\\123.png"; // 在当前目录下创建123a\\123b目录

    /*
    函数作用
    该函数的作用是检查指定目录是否存在,如果不存在则创建整个Dirpath所表示的整个目录。
    这个函数并不存在于 Kernel32.dll 中,需要包含头文件imagehlp.h,并链接imagehlp.lib。
    参数
    Dirpath:要检查的目录名。如果是路径不是文件名,需以 '\' 结尾。
    返回值
    如果目录存在,返回TRUE;如果不存在但全部路径创建成功,返回TRUE;
    如果不存在且创建失败,返回FALSE。
    atips: 只创建最后一个\\之前的目录路径,当前和绝对路径都支持
    */
    BOOL bRet = MakeSureDirectoryPathExists(dir);
    msg.Format("create = %d", bRet);
    AfxMessageBox(msg);

参考:

https://www.cnblogs.com/vincent2012/p/3321027.html

https://blog.csdn.net/qq0824/article/details/52387020

 int ToMakeDirs(const char *path){

int i;
    char* pszDir;
    int len;
    int iRet;
    
    if(path == NULL || strlen(path) == 0 )
        return -1;

    pszDir = strdup(path);  
    len = strlen(pszDir);
    for(i = 1; i < len; ++i)
    {
        if (pszDir[i] == '\\' || pszDir[i] == '/')
        {
            pszDir[i] = '\0';
            iRet = _access(pszDir, 0);
            if(iRet != 0)
            {
                iRet = _mkdir(pszDir);
                if(iRet != 0)
                {
                    free(pszDir);
                    return i;  
                }
            }
            pszDir[i] = '/';
        }
    }
    
    if(_access(pszDir, 0) != 0)
    {
        iRet = _mkdir(pszDir);
        if(iRet != 0)  
        {
            free(pszDir);
            return -2;
        }
    }

    free(pszDir);
    return 0;
}

 测试情况:

char path[300];
#if 0
sprintf(path, "mf1443"); // // 当前路径下创建 mf1443
sprintf(path, ".\\"); // 当前目录可以访问不会创建
sprintf(path, ".\\myf1353"); // 当前路径下创建 myf1353
sprintf(path, ".\\myf1353\\"); // 当前路径下创建 myf1353
sprintf(path, ".\\myf1353\\cd1353"); // 当前路径下创建多级目录 myf1353\\cd1353
sprintf(path, ".\\myf1353\\myf1353.txt"); //! 会当前路径下创建目录名为 myf1353.txt 的目录
sprintf(path, ".\\.."); //当前目录的上一级目录可以访问不会创建
sprintf(path, ".\\..\\myf1419"); // 在上一级目录创建 myf1419
#elif 0
sprintf(path, "..\\myf1357"); // 在上一级目录创建 myf1357
sprintf(path, "..\\myf1357\\myf1357"); // 在上一级目录创建多级目录 myf1357\\myf1357
sprintf(path, "../myf1357\\myf1357"); // 在上一级目录创建多级目录 myf1357\\myf1357
sprintf(path, "../myf1357/myf1357"); // 在上一级目录创建多级目录 myf1357\\myf1357
sprintf(path, "..\\myf1357/myf1357");//在上一级目录创建多级目录 myf1357\\myf1357
sprintf(path, "..\myf1357/myf1357"); //! 会当前目录创建 ..myf1357\\myf1357 (\不合法)
sprintf(path, "..\\..\\myf1419\\myf1419"); // 在上一级的上一级下创建多级目录
#else
sprintf(path, "c:\\myf1353.txt"); // 在c盘创建myf1353.txt目录
sprintf(path, "f:\\myf1353"); // f盘不存在无法创建
sprintf(path, "d:\\.."); // 什么鬼,不会创建
sprintf(path, "d:\\..myf1353"); // d盘下创建..myf1353目录
sprintf(path, "d:\\.myf1353"); // d盘下创建.myf1353目录
#endif
int iRet = ToMakeDirs(path);
posted @ 2020-12-10 14:42  晨光静默  阅读(202)  评论(1编辑  收藏  举报