Определение начального и конечного диапазона байтов, измененных в файле

StackOverflow https://stackoverflow.com/questions/632317

Вопрос

Я работаю над небольшой экспериментальной утилитой для использования в нашей компании, которая индексирует заметки, хранящиеся в нашем пользовательском программном обеспечении 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 (и она может быть довольно большой, отсюда и причина для службы полнотекстовой индексации).

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

Спасибо!

Редактировать:За одну транзакцию может быть добавлено, отредактировано или удалено более одной заметки, поэтому, если это возможно, метод должен иметь возможность определять несколько отдельных диапазонов байтов.

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top