创建目录
/* 功能:创建多级目录 参数: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);