Создание поддиректории - как оптимизировать?

Тема в разделе "WASM.BEGINNERS", создана пользователем TOLSTOPUZ, 19 июл 2008.

  1. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Создание подпапки: как оптимизировать?

    .data
    d1 db "C:\1",0

    .code
    start:

    invoke CreateDirectory, addr d1, 0

    ============================================
    Директория создаётся нормально.
    Но если
    d1 db "C:\1\1\1\1\1",0 ; Создаём подпапку

    То функция возвращает ошибку.
    Оно и понятно. Ведь директории выше не созданы.

    А мне нужна процедура, которая влёт бы создавала поддиректорию.

    Я пошёл таким путём:
    В буфере ищу символы обратного слеша,
    по ним определяю, что очередная папка,
    проверяю есть ли такая папка, создаю...
    Короче получилась громадная процедура
    под названием "Вселенская бредня".
    Ещё и не работает, зараза.
    Плюнул, решил спросить помощь зала.
    Можно ли как-то соптимизировать создание цепочки директорий?

    Да, в адресе конечно не единички, а реальные названия папок...
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    По логике вещей, проверку на существование папок можно прекратить после первого же отрицательного результата. Если папки до нас не существовало, то вестимо что и ни одной подпапки у неё тоже не было. А вообще, такой алгос вроде как по-другому и не решается...
    щас попробую напишу, поглядим.
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    си знаешь? на асенмблере писать долго:
    for(int x=0;x<len(tbuff);x++)
    if(tbuff[x]=='\\'){
    tbuff[x]=0;
    CreateDirectoryA(tbuff,0);
    tbuff[x]='\\';
    }
     
  4. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Да уж... Красиво. И коротко.
    Си я вот только не знаю к сожалению...
     
  5. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Держи спецально для тя сделал =)

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3.  
    4.  include WINDOWS.INC
    5.  include user32.inc
    6.  include kernel32.inc
    7.  
    8.  includelib KERNEL32.LIB
    9.  includelib USER32.LIB
    10.  
    11. .data
    12. d1 db "C:\1\1\1\1",0
    13. d1l dd  $-d1
    14. d2  dd  d1l
    15.  
    16. .code
    17.  
    18. CreateSubDirs proc uses edi mem:dword
    19.     mov     edi,mem
    20.     invoke  lstrlen,edi
    21.     mov     ecx,eax
    22. @@:
    23.     mov     al,'\'
    24.     cld
    25.     repne scasb
    26.     jne     @f
    27.     mov     eax,edi
    28.     sub     eax,mem
    29.     push    ecx
    30.     invoke  lstrcpyn,addr d2,mem,eax
    31.     invoke  CreateDirectory,addr d2,0
    32.     pop     ecx
    33.     jmp     @b
    34. @@:
    35.     invoke  CreateDirectory,mem,0
    36.     ret
    37. CreateSubDirs endp
    38.  
    39. start:
    40.  
    41.     invoke  CreateSubDirs,addr d1
    42.     invoke ExitProcess,0
    43.  
    44. end start
    Особенности, в конце "C:\1\1\1\1" сшель не ставить, тоесть так "C:\1\1\1\1\" НЕ НАДО.
    d2 просто буфер куда копируются куски пути, при желании можно перенести в локальную переменную
     
  6. TOLSTOPUZ

    TOLSTOPUZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2008
    Сообщения:
    509
    Тронут, тронут, дружище...
    Спасибо большое.
    Хорошо написано, а главное короче моего на порядок... :-(
    Использую.
     
  7. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Есть ещё 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
     
  8. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    Код (Text):
    1.     invoke SHCreateDirectoryEx,NULL,CTEXT("C:\X\Y\Z\"),NULL
     
  9. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Ага, только сломается на пути длиннее 248 символов, о чём чётко сказано в MSDN http://msdn.microsoft.com/en-us/library/bb762131(VS.85).aspx:
    Код (Text):
    1. int SHCreateDirectoryEx(      
    2.     HWND hwnd,
    3.     LPCTSTR pszPath,
    4.     const SECURITY_ATTRIBUTES *psa
    5. );
    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.
     
  10. dcskm4200

    dcskm4200 New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2004
    Сообщения:
    173
    Адрес:
    China
    Only the few case are there where the path longer than 248 characters.