Explorer и поиск по файлу

Тема в разделе "WASM.WIN32", создана пользователем MrMiXeR, 1 апр 2011.

  1. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Товарищи знатоки, объясните каким образом проводник ищет строку по файлам? Цель вопроса - написать нечто свое работающее по этому принципу. Возможно он использует какой-то COM для этого ? Вообще от чего оттолкнуться и куда копать ?
     
  2. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Это в один поток
    Код (Text):
    1.     repe    cmpsb       ;_fiss_string1,_fiss_string2
    2.     jcxz    _fiss_equal     ;ecx=0, то есть строки совпадают
    3.     jne _fiss_not_match ;если не равны - переход на not_match
    Это в восемь
    Код (Text):
    1.     movq mm0, [edi + ecx * 8]   ; тут строка №1
    2.     movq mm1, [esi + ecx * 8]   ; тут строка №2
    3.     pcmpeqd mm0, mm1        ; сравнение сразу 8 байт
    4.     movd eax, mm0
    5.     test al, al
    6.     jz stp                      ; если 0 - строки различны
    Есть служба индексации, которая все слова упорядочивает.
    Эти алгоритмы отдельная песня.
    Быстродействие поиска увеличивается.
    Если часто не менять файлы :)
     
  3. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Корневая папка поиска->рекурсивно создаются треды для поиска во вложенных папках->найденные файлы также запускаются в отдельных тредах, которые открывают их и шмонают кусочками на наличие строки.
    Тредов N-ое количество. Можно так я считаю.
     
  4. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Тогда при поиске будет создаваться несколько сотен тысяч нитей (обычное количество файлов на диске). Это плохо.
    Лучше уж просто сделать рекурсивную функцию вроде такой:
    Код (Text):
    1. Функция Поиск(Папка, Строка)
    2.     Пока ВПапкеЕстьЕщёФайлы(Папка)
    3.         ИмяФайла = ПолучитьИмяФайла(Папка)
    4.         Если ЭтоПапка(ИмяФайла) То
    5.             Поиск(ИмяФайла, Строка)
    6.         Иначе
    7.             ПоискВФайле(ИмяФайла, Строка)
    8.         Конец
    9.     Конец
    10. Конец
    Реализуете такой алгоритм на своём любимом языке программирования с помощью своих любимых команд перебора файлов в каталоге (например, FirstFirst, FindNext)
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    всегда было интересно... вроде у винды максимально-возможный тид/пид 65535, что будет при переполнении операционной системы потоками/процессами? новые просто не будут создаваться, или уйдем в бсод может)))

    всегда так и делал... канеш медленнее, чем с потоками, но по-моему вполне адекватный вариант... тем более, что в варианте с потоками потенциально можно забить не только дескрипторы, но и виртуальную память...

    ЗЫ KIV, как вы символ табуляции ставите в поле для ввода сообщения?)))
     
  6. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.186
    Адрес:
    подполье
    Я и имел ввиду же N-ое количество тредов, которое вы сами и определите и будете следить за этим количеством. Без всяких там индексаций и прочих теорий струн должно годно получиться и несложно.