Поскольку этот пост занимает высокое место в Google как «Создать дерево каталогов», я собираюсь опубликовать ответ, который будет работать для Windows - он будет работать с использованием Win32 API, скомпилированного для UNICODE или MBCS. Это перенесено из кода Марка выше.
Так как это Windows, с которой мы работаем, разделители каталогов - это BACK-слэши, а не прямые. Если вы предпочитаете использовать косую черту, измените значение '\\'
на '/'
Будет работать с:
c:\foo\bar\hello\world
и
c:\foo\bar\hellp\world\
(т. Е. Не требуется конечная косая черта, поэтому вам не нужно проверять ее.)
Прежде чем сказать «Просто используйте SHCreateDirectoryEx () в Windows», обратите внимание, что SHCreateDirectoryEx () устарела и может быть удалена в любое время из будущих версий Windows.
bool CreateDirectoryTree(LPCTSTR szPathTree, LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL){
bool bSuccess = false;
const BOOL bCD = CreateDirectory(szPathTree, lpSecurityAttributes);
DWORD dwLastError = 0;
if(!bCD){
dwLastError = GetLastError();
}else{
return true;
}
switch(dwLastError){
case ERROR_ALREADY_EXISTS:
bSuccess = true;
break;
case ERROR_PATH_NOT_FOUND:
{
TCHAR szPrev[MAX_PATH] = {0};
LPCTSTR szLast = _tcsrchr(szPathTree,'\\');
_tcsnccpy(szPrev,szPathTree,(int)(szLast-szPathTree));
if(CreateDirectoryTree(szPrev,lpSecurityAttributes)){
bSuccess = CreateDirectory(szPathTree,lpSecurityAttributes)!=0;
if(!bSuccess){
bSuccess = (GetLastError()==ERROR_ALREADY_EXISTS);
}
}else{
bSuccess = false;
}
}
break;
default:
bSuccess = false;
break;
}
return bSuccess;
}