Штука достаточно простая, большинство бы и так догадалось как делать, но иногда нужно просто держать сухим нужный кусок кода, вынуть его из заначки и применить.
Расскажу – как нужно делать. Нужно воспользоваться API-шной функцией CreateDirectory. Функция – повторюсь, из WinAPI, в MFC ничего подобного нет. Несколько раз видел в ответ на скупой и лаконичный ответ “CreateDirectory” вопрос “Это у какого класса такой метод?”. Вопрос подобный повергает меня в смущение, но это уже оффтопик.
А теперь рассмотрим очень часто встречающуюся ситуацию, когда при создании директории “C:\\1\\2\\3\\4” в момент попытки создания не существует ни директории 1, ни 2, ни 3, ни 4. В общем – создать её в этом случае одним вызовом CreateDirectory() не удастся. Тогда можно воспользоваться обещаным куском кода.
Данный код не привязан к Visual C++ или, например, lcc (на котором он и был написан), и вообще к С++ (на Дельфи ситуация будет выглядеть очень похоже, сдецл поменияется только синтаксис).
TCHAR sPathTo [] = “c:\\1\\2\\3\\4\\5\\6\\7\\8”;//директория, которую нужно создать
bool AQLCreateDirectory(TCHAR * sPathTo) { //пока директория не создана, будем пытаться её создать// while(CreateDirectory(sPathTo, NULL) == FALSE) { /* директория не создана, поэтому нужно сначала создать ”предыдущую” директорию */ TCHAR sTemp[MAX_PATH]; int k = strlen(sPathTo); strcpy(sTemp, sPathTo);
//пытаемся найти и создать директорию самого “нижнего” уровня while(CreateDirectory(sTemp, NULL) != TRUE) { /* пытаемся найти первичные половые признаки предыдущей директории.... */ while(szTemp1[--k] != '\\') { if(k<=1) return FALSE;/* похоже, что директория создана быть вообще не может! sTemp[k] = NULL; } /* ......а как только нашли - создать её */ } //во время первого прохода будет создана директория “1”, во время второго – “2” и т.д. } return TRUE; }
|
В общем, код достаточно простой, и ясен почти без комментариев. Более того: его можно изменить. Например: разобрать один раз строку с исходным путём, и потом создать подряд все директории, начиная с первой (может уменьшиться время потраченое на разбор строки), но могу сказать, почему я этого не сделал. Если не хватает 1-ой 2-х директорий в самом конце пути (наиболее часто встречающаяся ситуация), то код будет работать не намного дольше, а может и вообще быстрее (если вложенность большая).
Причин, по которым директория не может быть создана может быть много, например - у пользователя не хватает прав. В этом случае код можно расширять и дополнять. |