各ファイルのアーカイブ ビットをチェックする既存のバックアップ方法は、速度が遅くなる可能性があり、大規模なファイル システムでは非効率的です。この方法では、一時ファイルを含むすべてのファイルをスキャンする必要があり、バックアップ プロセスに時間がかかる可能性があります。
より効率的な方法には、ファイル システム 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 中国語 Web サイトの他の関連記事を参照してください。