<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">我们都知道CreateDirectory()只能创建一级目录,而不能创建多级目录。通过写一个递归函数来实现多级目录的创建。</span>
分为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的创建目录:
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;
}
注:本函数的PathFileExists()要包含头文件 Shlwapi.h 。