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

2

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

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

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

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

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

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

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

Спасибо!

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

  • 0
    Хахаха, любопытный случай исчезновения комментариев. =) В любом случае, я не Windows, но, насколько я вижу, FileSystemWatcher вам не поможет. Вам, вероятно, нужно использовать низкоуровневые API.
  • 0
    Верный. Я полагал, что FileSystemWatcher не скажет мне, какие байты были изменены, но я надеялся использовать его, чтобы хотя бы уведомить меня, когда файл был изменен. Мне просто нужно знать, что делать после получения уведомления.
Показать ещё 1 комментарий
Теги:
diff
pervasive
btrieve

1 ответ

1
Лучший ответ

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню