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