각 파일의 보관 비트를 확인하는 기존 백업 방법은 속도가 느려지고 대용량 파일 시스템에는 비효율적입니다. 이 접근 방식을 사용하려면 임시 파일을 포함한 모든 파일을 검사해야 하며 백업 프로세스 시간이 길어질 수 있습니다.
보다 효율적인 방법은 파일 시스템 USN(업데이트 시퀀스)을 사용하는 것입니다. 번호) 일지를 변경합니다. 파일 시스템 USN은 파일 생성, 삭제 및 수정을 포함하여 파일 시스템에 발생한 각 변경 사항에 대한 기록을 제공합니다.
NTFS 볼륨의 변경 사항을 감지하려면 FSCTL_ENUM_USN_DATA 제어 코드입니다. 이 제어 코드는 다음과 같습니다.
다음을 포함하여 각 파일에 대한 중요한 데이터를 검색합니다.
변경 사항을 검색하려면:
다음은 접근 방식을 보여주는 코드 조각입니다.
<code class="c++">DWORDLONG nextid; DWORDLONG filecount = 0; DWORD starttick, endtick; // Allocate memory for USN records void * buffer = VirtualAlloc(NULL, BUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // Open volume handle HANDLE drive = CreateFile(L"\\?\c:", GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL); // Get volume USN journal data USN_JOURNAL_DATA * journal = (USN_JOURNAL_DATA *)buffer; if (!DeviceIoControl(drive, FSCTL_QUERY_USN_JOURNAL, NULL, 0, buffer, BUFFER_SIZE, &bytecount, NULL)) { (...) } maxusn = journal->MaxUsn; MFT_ENUM_DATA mft_enum_data; mft_enum_data.StartFileReferenceNumber = 0; mft_enum_data.LowUsn = 0; mft_enum_data.HighUsn = maxusn; while (...) { if (!DeviceIoControl(drive, FSCTL_ENUM_USN_DATA, &mft_enum_data, sizeof(mft_enum_data), buffer, BUFFER_SIZE, &bytecount, NULL)) { (...) } nextid = *((DWORDLONG *)buffer); USN_RECORD * record = (USN_RECORD *)((USN *)buffer + 1); USN_RECORD * recordend = (USN_RECORD *)(((BYTE *)buffer) + bytecount); while (record < recordend) { filecount++; // Check flags and USNs to identify changes (...) record = (USN_RECORD *)(((BYTE *)record) + record->RecordLength); } mft_enum_data.StartFileReferenceNumber = nextid; }</code>
FSCTL_ENUM_USN_DATA를 사용하는 접근 방식은 다음을 제공합니다.
위 내용은 FSCTL_ENUM_USN_DATA를 사용하여 NTFS 볼륨의 파일 변경 사항을 어떻게 효율적으로 감지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!