Непонятки с FindFirstFile,FindNextFile?

Тема в разделе "WASM.WIN32", создана пользователем S_Alex, 26 май 2009.

  1. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Всем читающим этот "?" Доброго всем времени суток.

    Есть код:
    Код (Text):
    1.     invoke  MessageBox,NULL,ADDR T_Buf, lpSaveFolder,MB_OK
    2.     invoke  FindFirstFile,ADDR T_Buf,ADDR wfd       ; Ищем файлы
    3.     inc     eax                     ; Если ничего не нашли - выходим
    4. .if !ZERO?
    5.     dec     eax                     ; Иначе, сохраним
    6.     mov     [hSrch],    eax         ; хэндл поиска
    7.     .while  eax
    8.         ;< покажим что нашли
    9.         lea     eax,     [wfd.cFileName]
    10.         PrintStringByAddr eax
    11.         ;> 
    12.         invoke FindNextFile,[hSrch],ADDR wfd            ; Ищем следующий файл
    13.     .endw
    14.     ; Если ничего не нашли
    15.     invoke FindClose,[hSrch]                ; Закрываем хэндл поиска
    16. .endif
    Находит все файлы в указанной папке.
    Но если убрать
    Код (Text):
    1.  invoke MessageBox,NULL,ADDR T_Buf, lpSaveFolder,MB_OK
    или заменить на
    Код (Text):
    1.  invoke MessageBox,NULL,ADDR T_Buf, NULL,MB_OK
    Отказывается работать, выводит только часть файлов.
    T_Buf, wfd, hSrch - локальные переменные.
    Из какой оперы этот прикол? Подскажите.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    S_Alex
    Было когдато такое, ставь задержку.
     
  3. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Clerk
    Шаман однако!
    Код (Text):
    1.         invoke  Sleep,100
    Помогло. СПСБ.
    Правда тормоза ...
     
  4. JCronos

    JCronos New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2009
    Сообщения:
    98
    В поток вынеси
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronos
    Не верно. Связано с асинхронным чтением директори в апи, следует реализовать самостоятельно посредством натива.
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    А в чем, собственно, проблема с findnextfile? Хотите сказать, что функция настолько криво написана, что может с разу на раз пропускать некоторые файлы? oO
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Nouzui
    Это факт, я както писал поиск ресурсов с иконками во всех файлах, так эта апи кучу файлов пропускала.
     
  8. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Clerk
    Т.е. "глюк" возникает если во время поиска обращаться на чтение/запись к найденому файлу?
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    Clerk, ни разу не замечал, чтобы тотал/проводник вот так "пропускали" файлы.
    может, есть какие-то конкретные причины? Ось, FS, характер поиска, действия, предшевствующие findfirst и между вызовами findnext.. ?
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MirrorBlack
    Наверно изза того, что в FindFirstFile() не полностью выполняется проверка результата для сервиса NtQueryDirectoryFile получающего список файлов в директории, зотя может и флажки при открытии файлов тоже являются причиной..
     
  11. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Clerk
    Я вспомнил подобную фигню с ReadDirectoryChangesW.
    Лечилось sleep.
    Вот я и думаю, может работать с предпоследним дискриптором?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    IO_STATUS_BLOCK чекать наверно.
     
  13. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Clerk
    Надо автору провести эксперимент - запустить под FAT.
    Если глюк исчезнет - флажки всему виной.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Епт, первый раз слышу чтоб FindXxxFile так глючила) Никогда раньше не встречал.
    Быть может все-таки у тебя ошибка?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Какая есчо ошибка у меня может быть :dntknw:
     
  16. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Может FindFileNext попробовать проверять на (ноль) или на (ERROR_NO_MORE_FILES = 18) ?
    Можно ещё попробовать обнулить структуру (wfd) перед вызовом FindFileFirst.
    хотя вряд ли это делу поможет...
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    slavanap
    Не наверно проще будет нтстатус проверить, так что лучше самому написать.
     
  18. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Clerk
    5+
    Не ошибается тот - кто ничего не делает :)
     
  19. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Спасибо за поддержку!
    На 2000 всё прошло без всяких глюков, а на работе под XP SP2, то работает, то нет. Функция FindNextFile просто вылетает со всей прогой, ни сообщений обо ошибке ни ни. Просто "ХЛОП" и нет проги. Скорее всего глючно написанная функция FindNextFile. Два года назад, уже 3, юзал ее в потоке на этой же машине, проблем не было. Прога делала список файлов со всех жестких дисков. Работатала.
    Может всё таки мне систему переустановить, 3 год как стоит.
     
  20. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Скорее всего баг в коде(99%), а не в FindNextFile.