пронумеровать файлы

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 28 окт 2011.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Какие функции лучше использовать чтобы переименовать файл и при этом избежать совпадения?
    Типа If File Exist = file10 then rename to file12
    Или как сгенерировать CLSID полд асмом, чтобы в него переименовать файл?
    Вобшем не знаю, наверное есть простое решение, подскажите.
     
  2. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    А любой другой хэш (от файла) не устроит? SHA-160, например.
    Быстрый (32 bits) Hsieh hash почти не дает коллизий.
    http://www.azillionmonkeys.com/qed/hash.html
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Не обязательно избегать совпадения. Пусть, нужно переименовать файл в "uniquefilename_0.txt". Делаем MoveFile и, если в ответ получаем ERROR_ALREADY_EXISTS, то инкрементируем счётчик (получаем "uniquefilename_1.txt") и повторяем процедуру. Выходим из цикла, когда MoveFile возвращает успех. По обстоятельствам вместо инкрементирования, начиная с нуля, в качестве числового суффикса можно брать результат работы rdtsc.
     
  4. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    спасибо!
     
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. section '.code' executable
    3. start:
    4.         sub rsp,8
    5.  
    6.         invoke ExpandEnvironmentStrings,'%SystemDrive%\HashTab.dll',a1,MAX_PATH
    7.         invoke ExpandEnvironmentStrings,'%SystemDrive%\1',a2,MAX_PATH
    8.         mov [lpFileOp.pFrom],a1
    9. @@:
    10.         invoke lstrcat,a2,a3
    11.         mov [lpFileOp.pTo],a2
    12.         mov [lpFileOp.wFunc],FO_RENAME
    13.         mov [lpFileOp.fFlags],FOF_SILENT + FOF_FILESONLY
    14.         invoke SHFileOperation,lpFileOp
    15.         cmp eax,NULL
    16.         jz exit
    17.         inc [a3]
    18.         jmp @r
    19. exit:
    20.         invoke ExitProcess,NULL
    21.  
    22.         FO_RENAME = 0x0004
    23.         FOF_SILENT = 0x0004
    24.         FOF_FILESONLY = 0x0080
    25.  
    26. section '.data' readable writeable
    27.  
    28.         a1 rd MAX_PATH
    29.         a2 rd MAX_PATH
    30.         a3 db '2'
    31.  
    32. struct LPSHFILEOPSTRUCT
    33.  
    34.         hwnd dq NULL
    35.         wFunc dq NULL
    36.         pFrom dq NULL
    37.         pTo dq NULL
    38.         fFlags dq NULL
    39.         fAnyOperationsAborted dq NULL
    40.         hNameMappings dq NULL
    41.         lpszProgressTitle dq NULL
    42. ends
    43.         lpFileOp LPSHFILEOPSTRUCT
    44.  
    45. section '.idata' import readable
    46.  
    47.         library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    48.         include '%fasm%/api/kernel32.inc'
    49.         include '%fasm%/api/shell32.inc'
    Вот такой вот код. Круче не смог придумать. :)

    а что память нельзя инкримминировать? inc [a3] пишут, что надо через регистр... 0_o
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Semiono
    Поставь .386 В 286-м такой команды еще не изобрели :) inc [a3]
     
  7. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    фасму всё пофиг, он как топор))
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Semiono
    Кто пишет?
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Semiono
    Тогда возможно дело в том, что ты пишешь под x64 и надо явно указать, что a3 у тебя байт, а не 8-ми байтовое. Хотя странно все это.