Создание подпапки: как оптимизировать? .data d1 db "C:\1",0 .code start: invoke CreateDirectory, addr d1, 0 ============================================ Директория создаётся нормально. Но если d1 db "C:\1\1\1\1\1",0 ; Создаём подпапку То функция возвращает ошибку. Оно и понятно. Ведь директории выше не созданы. А мне нужна процедура, которая влёт бы создавала поддиректорию. Я пошёл таким путём: В буфере ищу символы обратного слеша, по ним определяю, что очередная папка, проверяю есть ли такая папка, создаю... Короче получилась громадная процедура под названием "Вселенская бредня". Ещё и не работает, зараза. Плюнул, решил спросить помощь зала. Можно ли как-то соптимизировать создание цепочки директорий? Да, в адресе конечно не единички, а реальные названия папок...
По логике вещей, проверку на существование папок можно прекратить после первого же отрицательного результата. Если папки до нас не существовало, то вестимо что и ни одной подпапки у неё тоже не было. А вообще, такой алгос вроде как по-другому и не решается... щас попробую напишу, поглядим.
си знаешь? на асенмблере писать долго: for(int x=0;x<len(tbuff);x++) if(tbuff[x]=='\\'){ tbuff[x]=0; CreateDirectoryA(tbuff,0); tbuff[x]='\\'; }
Держи спецально для тя сделал =) Код (Text): .386 .model flat,stdcall include WINDOWS.INC include user32.inc include kernel32.inc includelib KERNEL32.LIB includelib USER32.LIB .data d1 db "C:\1\1\1\1",0 d1l dd $-d1 d2 dd d1l .code CreateSubDirs proc uses edi mem:dword mov edi,mem invoke lstrlen,edi mov ecx,eax @@: mov al,'\' cld repne scasb jne @f mov eax,edi sub eax,mem push ecx invoke lstrcpyn,addr d2,mem,eax invoke CreateDirectory,addr d2,0 pop ecx jmp @b @@: invoke CreateDirectory,mem,0 ret CreateSubDirs endp start: invoke CreateSubDirs,addr d1 invoke ExitProcess,0 end start Особенности, в конце "C:\1\1\1\1" сшель не ставить, тоесть так "C:\1\1\1\1\" НЕ НАДО. d2 просто буфер куда копируются куски пути, при желании можно перенести в локальную переменную
Тронут, тронут, дружище... Спасибо большое. Хорошо написано, а главное короче моего на порядок... :-( Использую.
Есть ещё MakeSureDirectoryPathExists - http://msdn.microsoft.com/en-us/library/ms680352(VS.85).aspx правда имеет ряд недостатков. Более универсальный вариант под NT системы (чтобы работал с длинными (до 32000 символов) и в национальных кодировках путями) - использование в цикле CreateDirectoryW (по аналогии с вышеприведённым кодом) + добавление к имени префикса \\?\ http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx
Ага, только сломается на пути длиннее 248 символов, о чём чётко сказано в MSDN http://msdn.microsoft.com/en-us/library/bb762131(VS.85).aspx: Код (Text): int SHCreateDirectoryEx( HWND hwnd, LPCTSTR pszPath, const SECURITY_ATTRIBUTES *psa ); Parameters hwnd [in] A handle to a parent window. This parameter can be set to NULL if no user interface will be displayed. pszPath [in] A pointer to a null-terminated string specifying the fully qualified path of the directory. This string is of maximum length of 248 characters, including the terminating null character. psa [in] A pointer to a SECURITY_ATTRIBUTES structure with the directory's security attribute. Set this parameter to NULL if no security attributes need to be set.