Консультация № 72430
24.01.2007, 14:50
0.00 руб.
0 3 3
Подскажите пожалуйста если зациклить фунуцию
создания директории (CreateDirectory()), то как можно
после каждого прохода цикла переписывать переменную
"Patch".В которой менять только имя файла, а путь
оставить прежним? Что-то типа "Patch++".
Что бы создавались директории :
New_Folder 1
New_Folder 2
New_Folder 3 , и так далее ?????
И еще, допустим создать директорию в только что
созданной и т.д.

Приложение:
#include <windows.h>#pragma argsused//-------------------------------------------------------------------int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)//--------------------------------------------------------------------{ LPCTSTR Patch="C:\New_Folder"; CreateDirectory(Patch,NULL); return 0;}

Обсуждение

Неизвестный
24.01.2007, 16:15
общий
это ответ
Здравствуйте, DEVILL!
Ну введите счетчик повторений цикла, что-то вроде int count = 0; и вставте его в тело цикла. Далее нам нужно к строке "C:\\New_Folder"" прилепить значение счетчика, преобразованное в троку. Делаем это так:
char buffer[32];
sprintf(buffer, "C:\\New_Folder %d", count);
И делаем приведение типов:
LPCTSTR Patch = (LPCTSTR)buffer;
Неизвестный
24.01.2007, 16:42
общий
это ответ
Здравствуйте, DEVILL!

По первому вопросу:

необходимо создать цикл с таким количеством проходов, сколько Вам нужно директорий первого уровня. В теле цикла формируем новую строку с именем директории исходя из заданного начального имени и счетчика цикла. Затем создаем директорию.

По второму вопросу:

в этом же цикле вызываем другую нашу функцию, которая и создает в только что созданной директории новую.

в приложении я набросал код, который решает Вашу ЧАСТНУЮ задачу. Это Вам в качестве примера.

Для того, чтобы создать универсальное решение, необходимо писать рекурсивную функцию, которой в качестве параметра передавать необходимый для создания путь. Эта функция должна последовательно от верхней до нижней перебрать все директории, присутствующие в этом пути, проверить их существование и, если они не существуют, то создать их.

Всего доброго.

ЗЫ: Вашу прагму argsused я из кода убрал, т.к. у меня не Borland C++. Также я переименовал переменные в соответствии с той нотацией, которую использую. Уж не обессудьте. Ну и все строки и символы я заключил в макрос TEXT(), который поможет Вам при компиляции одного и того же кода в ANSI и в UNICODE формате.


Приложение:
#include <windows.h>#include <strsafe.h>BOOL path_CheckName(LPTSTR szBuf, size_t cchPath){ size_t cchlen; if (!szBuf) return FALSE; if (FAILED(StringCchLength(szBuf, cchPath, &cchlen)) || cchlen == 0) return FALSE; if (szBuf[cchlen - 1] != TEXT(‘\\‘)) { szBuf[cchlen] = TEXT(‘\\‘); szBuf[cchlen + 1] = TEXT(‘\0‘); } return TRUE;}BOOL CreateSubDir(LPTSTR lpPath, size_t cchPath, LPTSTR lpDir){ path_CheckName(lpPath, cchPath); if (SUCCEEDED(StringCchCat(lpPath, cchPath, lpDir))) { CreateDirectory(lpPath, NULL); return TRUE; } return FALSE;}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ LPCTSTR lpPath = TEXT("C:\\New_Folder"); TCHAR szFolder[MAX_PATH]; int i; for (i = 1; i < 11; i++) { StringCchPrintf(szFolder, MAX_PATH, TEXT("%s %u"), lpPath, i); CreateDirectory(szFolder, NULL); CreateSubDir(szFolder, MAX_PATH, TEXT("Dir 1")); } return 0;}
Неизвестный
24.01.2007, 22:51
общий
это ответ
Здравствуйте, DEVILL!
Как вариант - ищешь в строке Patch последнее
вхождение символа обратной косой черты, т.е ‘\\‘.
Если строка Patch заканчивается этим символом, тогда
истино *(Patch+strlen(Patch)-1)==‘\\‘, иначе -
следующий символ в строке - это и исть само имя каталога.
И вот по этому адресу копируем новое имя каталога (strcpy) и вызываем
CreateDirectory(Patch,NULL) - создан новый каталог.
Чтобы создать подкаталог в уже существующем каталоге нуно
просто дополнить путь к нему в строке Patch.
Удачи!

Форма ответа