파일에서 변경된 바이트의 시작 및 종료 범위 결정
-
08-07-2019 - |
문제
전체 텍스트 검색을 위해 사용자 정의 CRM 소프트웨어에 저장된 노트를 인덱싱하는 회사 내에서 사용할 수있는 약간의 실험 유틸리티를 연구하고 있습니다. 이 노트는 btrieve 데이터베이스 (notes.dat라는 파일)에 저장됩니다. Pervasive의 ADO.NET 제공 업체를 사용하여 데이터베이스에 연결하고 인덱싱을위한 메모를 검색 할 수 있습니다. 그러나 인덱서는 현재 각 음표를 통해 루프를하고 5 분마다 다시 표시합니다. 이것은 비효율적 인 것 같습니다.
불행히도, CRM 소프트웨어는 데이터베이스가 원격 시스템에 존재할 수 있기 때문에 메모가 변경되었다는 인덱싱 서비스에 신호를 보낼 방법이 없습니다 (개발자는 내와 통신 할 절차를 작성하지 않기 때문입니다. 네트워크를 통한 서비스는 현재 취미 프로젝트이기 때문에).
포기하기보다는이 기회를 통해 Raw Btrieve 데이터베이스에 대해 조금 더 배우고 싶습니다. 그래서 여기 내 계획이 있습니다 ...
CRM 소프트웨어는 ODBC 드라이버 대신 Btrieve API를 사용하므로 Notes.DAT 파일을 공유해야합니다 (이는 클라이언트 설치가 네트워크에서 파일 자체를 볼 수 있어야 함). 이 파일 (FileSystemWatcher와 같은 것을 사용하여)을 모니터링 한 다음 변경된 바이트를 결정하고 싶습니다. 이 정보를 사용하여 해당 위치에서 레코드를 계산하고 주요 키를 얻으려고 노력합니다. 인덱서는 Pervasive의 ADO.NET 제공 업체를 사용하여 해당 레코드 만 업데이트됩니다.
문제 (Btrieve 파일의 구조를 아직 모르거나 원시 데이터에서 기본 키를 결정하는 것이 가능하다는 사실 외에도) notes.dat에서 변경되었습니다.
나는 두 가지 버전을 차별 할 수 있지만, 그것은 어딘가에 notes.dat 사본을 저장하는 것을 의미합니다 (그리고 그것은 상당히 클 수 있으므로 전체 텍스트 색인 서비스의 이유입니다).
이것을하는 가장 효율적인 방법은 무엇입니까?
감사!
편집 : 하나의 트랜잭션에서 하나 이상의 메모를 추가, 편집 또는 삭제할 수 있으므로 가능하면 여러 개의 별도의 바이트 범위를 결정할 수 있어야합니다.
해결책
당신의 경우 NOTES.DAT
파일은 an에 저장됩니다 NTFS 파티션, 그런 다음 다음 중 하나를 수행 할 수 있어야합니다.
- 사용 USN 저널 확인하다 변화 파일에 (선호)
- 사용 볼륨 그림자 사본 서비스 VSS (매우 빠른)를 통해 주기적 스냅 샷을 가져 와서 파일의 변경 사항을 추적하려면 다음 중 하나입니다.
diff
ing 버전N
그리고N-1
(아마도 구매만큼 느리지 않지만 여전히 느리게)- 더 깊이 탐구하고 노력하고 있습니다
diff
그만큼$Mft
관심있는 파일에 대한 오프셋이 어떤 블록을 변경했는지 결정하려면 (훨씬 더 복잡하지만 훨씬 빠르지 만 여전히 USN 저널을 사용하는 것만 큼 빠르고 신뢰할 수 있고 간단하지 않음)
USN 저널을 사용하는 것이 선호하는 방법이어야합니다. 당신은 사용할 수 있습니다 FSUTIL
USN Journal을 생성하고 잘라내는 유틸리티.