Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Anda Boleh Mengesan Perubahan Fail dengan Cekap pada Jilid NTFS Menggunakan FSCTL_ENUM_USN_DATA?
Kaedah sandaran sedia ada, yang menyemak bit arkib setiap fail, boleh menjadi perlahan dan tidak cekap untuk sistem fail besar. Pendekatan ini memerlukan pengimbasan semua fail, termasuk fail sementara, dan boleh mengakibatkan proses sandaran yang panjang.
Kaedah yang lebih cekap melibatkan penggunaan Sistem Fail USN (Jujukan Kemas Kini Nombor) menukar jurnal. Sistem fail USN menyediakan rekod untuk setiap perubahan yang dibuat pada sistem fail, termasuk penciptaan fail, pemadaman dan pengubahsuaian.
Untuk mengesan perubahan pada volum NTFS, kita boleh menggunakan Kod kawalan FSCTL_ENUM_USN_DATA. Kod kawalan ini:
Mendapatkan semula data kritikal untuk setiap fail, termasuk:
Untuk mengesan perubahan:
Berikut ialah coretan kod yang menunjukkan pendekatan:
<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>
Pendekatan menggunakan FSCTL_ENUM_USN_DATA menawarkan:
Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mengesan Perubahan Fail dengan Cekap pada Jilid NTFS Menggunakan FSCTL_ENUM_USN_DATA?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!