Как узнать есть файл, или его нету?

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

  1. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    мб of не нравится, а вобще ошибку надо прикладывать
     
  2. Colibri

    Colibri New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    117
    Shoorup
    кого и где ты объявил?? ))))

    invoke OpenFile offset FileName, offset of, OF_EXIST

    of - это структура, а не имя файла. И заполняется она до того, как происходит считывание FileName и открытие файла.
    В твоем случае, имя файла перетирается.

    Вот так выглядит структура

    Код (Text):
    1. typedef struct _OFSTRUCT
    2. {  
    3. BYTE cBytes;  
    4. BYTE fFixedDisk;  
    5. WORD nErrCode;  
    6. WORD Reserved1;  
    7. WORD Reserved2;
    8. CHAR szPathName[OFS_MAXPATHNAME];
    9. } OFSTRUCT,  *POFSTRUCT;
    А вот так должен выглядеть твой код:
    Код (Text):
    1. .data
    2. ;....
    3. of db 200h dup (0)
    4. FileName db "E:\masm32\dbablockc.dll",0
    5.  
    6. .text
    7. ;....
    8. invoke OpenFile offset FileName, offset of, OF_EXIST
    9. inc eax
    10. jz file_not_exist
    11.  
    12. ;тут обработчик, если файл найден
    13.  
    14. file_not_exist:
    15.  
    16. ;тут обработчик, если файл НЕ найден
    функция вернет 0FFFFFFFFh если файл не найден
    если не 0FFFFFFFFh - файл существует
     
  3. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Colibri
    всеравно не работает... а для чего в дате объявлять of db 200h dup (0) ? Как новичку тяжело разобраться. Не серчайте, а подскажите подробней как все должно выглядеть.

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include \masm32\include\kernel32.inc
    5. include \masm32\include\user32.inc
    6.  
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib
    9. .data
    10. of db 200h dup (0)
    11. FileName db "E:\masm32\dbablockc.dll",0
    12. MsgTextT db "Файл существует",0
    13. MsgTextF db "Такого файла нет",0
    14. MsgTitle db "Test",0
    15. .code
    16. start:
    17. invoke OpenFile offset FileName, offset of, OF_EXIST
    18. inc eax
    19. je true
    20. invoke MessageBox, 0, ADDR MsgTextF, ADDR MsgTitle, 0
    21. jmp exit
    22. true:
    23. invoke MessageBox, 0, ADDR MsgTextT, ADDR MsgTitle, 0
    24. exit:
    25. invoke ExitProcess, 0
    26. end start
    Дает ошибку в строке: invoke OpenFile offset FileName, offset of, OF_EXIST
    ошибка - missing operator in expression
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Shoorup
    Более дзенный вариант :)
    Код (Text):
    1. .386
    2. .model flat
    3. include kernel32.inc
    4. include user32.inc
    5. include windows.inc
    6.  
    7. includelib kernel32.lib
    8. includelib user32.lib
    9. .data
    10. FileName db "dbablockc.dll",0
    11. MsgTextT db "Файл существует",0
    12. MsgTextF db "Такого файла нет",0
    13. MsgTitle db "Test",0
    14. message dd MsgTextF,MsgTextT
    15. .code
    16. start: xor ebx,ebx
    17. sub esp,200h; создаем временный буфер
    18. mov ecx,esp
    19. invoke OpenFile, addr FileName, ecx, OF_EXIST
    20. add esp,200h ;удаляем временный буфер
    21. inc eax
    22. setne bl
    23. invoke MessageBox, 0, [message+ebx*4], ADDR MsgTitle, 0
    24. retn
    25. end start
     
  5. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    А кто хэндл будет закрывать?;)
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    asmfan
    Код (Text):
    1. inc eax
    2. setne bl
    3. test eax,eax
    4. jz a1
    5. dec eax
    6. invoke CloseHandle, eax
    7. a1: invoke MessageBox, 0, [message+ebx*4], ADDR MsgTitle, 0
    8. retn
     
  7. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Mikl__
    Классно! Заработало кажись. Тока чего-то у меня windows.inc не хочет подключаться. пришлось делать OF_EXIST equ 4000h.
    Если честно то не догоняю как работает вот это :
    setne bl
    invoke MessageBox, 0, [message+ebx*4], ADDR MsgTitle, 0
    подскажите плиз как работает, если еще не достал:)
    Еще вопросик: а для чего нужно создавать временный буфер?
    в любом случае красивше чем у меня:) или грамотнее.
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Shoorup
    Я сторонник маленького размера файлов на асме, поэтому, отводить под буфер, который используется всего один раз 200h (512) байтов считаю расточительным. Как выход - выделяю 512 байт в стеке sub esp,200h передаю указатель на этот буфер в ecx (mov ecx,esp), после использования возвращаю стековый указатель на место add esp,200h
    В твоем варианте -- ты дважды вызываешь MessageBox, чтобы в зависимости от того равен eax нулю или нет передать один из двух текстов сообщения - в моем варианте if (eax!=0) ebx=1 (addr message+4=addr MsgTextT) else ebx=0 (addr message+0 = addr MsgTextF) в первом случае будет передано сообщение "Файл существует" иначе "Такого файла нет",