Поиск внутри файлов
В этом разделе рассматривается: fd.find.
Метод fd.find позволяет быстро искать по файлу с заданной начальной позиции, вперёд или назад, и находить N-е вхождение искомой подстроки. Метод также позволяет задать «приращение» (шаг) поиска. Поиск выполняется в текущем выбранном файле, выбор делается через свойство fd.filenum.
Поиск возвращает позицию в файле (отсчёт с 1), где встретилось нужное вхождение подстроки, или 0, если нужное вхождение подстроки не найдено.
Параметр приращения очень важен, так как позволяет выполнять два принципиально разных вида поиска.
Полнотекстовый поиск
Задайте приращение 1, и поиск пройдёт по всему содержимому файла:
Dim dw As dword
'try to find the 2nd occurrence of 'ABC', search forward starting at the beginning of the file
dw=fd.find(1,"ABC",2,FORWARD,1)
If fd.laststatus<>PL_FD_STATUS_OK Then
'some disk-related error
Else
If dw<>0 Then
'found! process this...
Else
'not found...
End If
Поскольку в искомой подстроке из примера выше - «ABC» - нет повторяющихся фрагментов, приращение поиска можно задать равным трём (длине подстроки). Это ускорит поиск:
fd.find(1,"ABC",2,FORWARD,3) 'no repeating fragments in the substring, use its length as increment
Поиск по записям
Если файл представляет собой таблицу данных из отдельных записей, можно организовать очень эффективный поиск записи с нужным значением поля. Для этого нужно лишь, чтобы поля записи занимали фиксированные смещения внутри записей. Например, пусть есть таблица данных из записей такой структуры:
| Имя поля | Смещение в байтах* | Длина в байтах |
| Category | +0 | 1 |
| ID-code | +1 | 11 |
| Last name | +12 | 21 |
| First name | +43 | 21 |
* относительно начала записи
Каждая запись этой таблицы занимает 54 байта, это и будет наш шаг. Три поля - «ID-code», «Last name» и «First name» - строки, которые, разумеется, могут иметь переменную длину. Чтобы использовать метод fd.find, каждое поле должно находиться по фиксированному смещению относительно начала записи. То есть даже если «ID-code» конкретной записи короче максимально возможной длины поля, поле «Last name» всё равно будет по смещению +12. Чтобы отразить фактическую длину данных поля, каждое поле строкового типа начинается с байта, обозначающего длину строки, после которого идут сами данные строки:

Теперь предположим, что нужно найти запись, у которой «Last name» равно «Smith». Для этого мы ищем, начиная со смещения 21 в файле, то есть со смещения поля «Last name» внутри записи (здесь предполагается, что первая запись начинается прямо с начала файла, что обычно так и есть). Шаг поиска будет равен 54 - размеру записи:
Dim dw As dword
'try to find the record with the "Last name" set to "Smith"
dw=fd.find(21,chr(5)+"Smith",1,FORWARD,54) 'notice how we supply the string length
If fd.laststatus<>PL_FD_STATUS_OK Then
'some disk-related error
Else
If dw<>0 Then
'found- convert into the record number and process...
dw=dw/54
Else
'not found...
End If
Искать можно и в обратном направлении, но помните, что это менее эффективно (занимает примерно на 50% больше времени), чем поиск вперёд.