Определение начального и конечного диапазона байтов, измененных в файле - PullRequest
2 голосов
/ 11 марта 2009

Я работаю над небольшой экспериментальной утилитой для использования в нашей компании, которая индексирует заметки, хранящиеся в нашем специальном программном обеспечении CRM, для полнотекстового поиска. Эти заметки хранятся в базе данных Btrieve (файл с именем NOTES.DAT). Можно подключиться к базе данных и получить заметки для индексации с помощью поставщика Pervasive ADO.NET. Однако в настоящее время индексатор просматривает каждую заметку и переиндексирует ее каждые 5 минут. Это кажется крайне неэффективным.

К сожалению, наше программное обеспечение CRM не может сообщить службе индексирования о том, что примечание было изменено, поскольку база данных может существовать на удаленном компьютере (и разработчики не собираются писать процедуру для общаться с моим сервисом по сети, так как это пока просто хобби).

Вместо того, чтобы сдаваться, я хотел бы воспользоваться этой возможностью, чтобы узнать немного больше о необработанных базах данных Btrieve. Итак, вот мой план ...

Файл NOTES.DAT должен быть предоставлен в общий доступ, поскольку наше программное обеспечение CRM использует Btrieve API, а не драйвер ODBC (что означает, что клиентские установки должны иметь возможность видеть сам файл в сети). Я хотел бы контролировать этот файл (используя что-то вроде FileSystemWatcher?), А затем определить байты, которые были изменены. Используя эту информацию, я попытаюсь вычислить запись в этой позиции и получить ее первичный ключ. Затем индексатор обновит только эту запись с помощью поставщика Pervasive ADO.NET.

Проблема (помимо того факта, что я пока не совсем знаю структуру файлов Btrieve или возможно ли определение первичного ключа из необработанных данных) заключается в том, что я не знаю, как определить начальный и конечный диапазон байтов, которые были изменены в NOTES.DAT.

Я мог бы различать две версии, но это означало бы хранить где-нибудь копию NOTES.DAT (и она может быть довольно большой, отсюда и причина службы полнотекстового индексирования).

Какой самый эффективный способ сделать это?

Спасибо!

РЕДАКТИРОВАТЬ: возможно добавление, редактирование или удаление более одной заметки в одной транзакции, поэтому, если возможно, метод должен иметь возможность определять несколько отдельных диапазонов байтов.

1 Ответ

1 голос
/ 11 марта 2009

Если ваш NOTES.DAT файл хранится в NTFS-разделе , то вы сможете выполнить одно из следующих действий:

  • используйте журнал USN для определения изменений в вашем файле (предпочтительно)
  • используйте службу теневого копирования для отслеживания изменений в вашем файле, делая периодические снимки через VSS (очень быстро), а затем либо:
    • diff ing версии N и N-1 (вероятно, не такие медленные, как переиндексация, но все еще медленные), или
    • углубляясь в глубину и пытаясь сделать diff $Mft, чтобы определить, какие блоки изменились, с какими смещениями для файла (файлов), представляющих интерес (гораздо более сложный, но и гораздо более быстрый - но все же не такой быстрый, надежный и просто, как с помощью журнала USN)

Использование журнала USN должно быть вашим предпочтительным методом. Вы можете использовать утилиту FSUTIL для создания и усечения журнала USN.

...