FindFirstFile\ FindNextFile

Тема в разделе "WASM.BEGINNERS", создана пользователем Sonic_, 12 авг 2005.

  1. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    Нужно получить содержимое папки (включая все подпапки и файлы в них).

    Вопрос: можно ли это сделать быстрее и проще чем использовать FindFirstFile, FindNextFile

    И ещё при использовании FindFirstFile\ FindNextFile с путём для поиска ... *.* FindFirstFile

    находит точку а FindNextFile – две, следующие FindNextFile находят нормальные файлы, так

    должно быть ?



    [​IMG] 517308021__1.rar
     
  2. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    ИМХО нет.

    А то, что находится точка - так это текущий каталог.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    ответ:

    1) быстрее — да, под NT NtQueryDirectoryFile.

    2) проще — в общем случае нет, посмотри в библиотеке си, может там проще.

    3) "точка" и "две" - это ссылки на текущий и родительский каталоги, они заложены в сами ФС. Другое дело, что они не всегда нужны тому, кто запрашивает список файлов, но тут ничего не поделаешь.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    А какой смысл искать, какая функция быстрее, если скорость ограничена скоростью вращения винта, а не тем, какие функции задействованы. Из времени, которое ф-ция тратит на добывание имени, минимум 90% уходит на то, чтобы крутить винт.

    Точки можно просто игнорировать.
     
  5. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    2 noonv & IceStudent

    Ну про точки примерно так и думал.

    2 cresta

    Поискать альтернативу стоит хотяб потому что данный вариант может вызвать переполнение стека.

    О существовании NtQueryDirectoryFile знаю, но не знаю как использовать, если у кого есть что почитать то поделитесь плиз !
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Sonic_

    > Поискать альтернативу стоит хотяб потому что данный вариант может вызвать переполнение стека

    Да и большое число открытых хэндлов то же не есть гуд. Альтернатива - не использовать рекурсивный вызов get_folder_content. При каждом проходе FindFirst\FindNext нужно просто помещать имена папок в список (очередь), а по окончании поиска в текущей папке переходить к поиску в подпапках.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Sonic_



    Переполнение стека вызывает любая процедура, многократно вызывающая сама себя, и имеющая некоторое кол-во входных параметров, передаваемых через стек. FindFirstFile\FindNextFile сама себя не вызвает, и переполнения вызвать не может.
     
  8. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    Вопрос: NtQueryDirectoryFile требует хендл, чем его получить (какой функцией) ?
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
  10. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Памяти выделяется мало. При большом кол-ве файлов падает программа.
     
  12. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    Исправим. Как решение, можно предложить сделать File

    Mapping и писать туда.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Зачем? Будет ещё тормоз. Ты же определяешь длину строки с именем найденного файла, вот и заведи переменную, в которой суммируй длину всех имен. Когда достигнет выделенного предела, запрашиваешь новый кусок памяти в дополнение к первоначально выделенному.

    Только надо будет GlobalAlloc заменить на VirtualAlloc, чтобы новый кусок выделялся сразу за заполненным, без разрыва.
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Sonic_

    можно ли это сделать ... проще

    Да.

    dir [диск:][путь][имя_файла] /s /b | sort > FolderContent.txt
     
  15. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    q_q

    Мне кажется, что FindFirstFile\FindNextFile лучше



    cresta



    GlobalAlloc+GlobalReAlloc вроде тоже можно ?
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Sonic_

    Критерии оценки лучшести?
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Sonic_

    > "GlobalAlloc+GlobalReAlloc вроде тоже можно ?"

    Можно, но не нужно ;) Эту тему уже сотни раз обсуждали. Во-первых, GlobalXXX устаревшие функции, оставленные для обратной совместимости с 16-бит windows, работают они как и HeapXXX через RtlXXXHeap, но с дополнительными наворотами и поэтому медленнее (см.msdn). Во-вторых, блоки более 512К хип-менеджер по любому выделяет через VirtualAlloc, но адресов при этом резерервирует столько сколько запросили (округляет вверх до 64К). Поэтому при GlobalRealloc приходится резервировать новый блок памяти и копировать туда данные (в лучшем случае путем трансляции выделенных страниц по новым адресам, в худшем путем копирования данных - как на самом деле не знаю). Поэтому в твоей задачке лучше напрямую использовать VirtualAlloc сразу резервируя "XXL" мегабайт, тогда в случае нехватки первоначально выделенной (commit) памяти можно ее наращивать без разрывов и перелокаций.
     
  18. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    2 q_q

    FindFirstFile\FindNextFile возвращает доп. информ,а dir

    сохранит всё в текстовом виде и всё, делай что хочешь.

    Да и чем оно проще, лучше, быстрей ? Тут ведь задача не

    сохранить всё в файл.



    2 leo

    Спасибо, попробуем
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Sonic_

    Тут ведь задача не сохранить всё в файл.

    Imho ViewFolder_final только и делает, что пытается сохранить найденные имена в файл. Разве не так?



    и чем оно проще

    Тем, что достаточно вызвать CreateProcess.
     
  20. Sonic_

    Sonic_ New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    10
    "Imho ViewFolder_final только и делает, что пытается сохранить найденные имена в файл. Разве не так?"



    Открой и посмотри, что и как !