cari
Rumahpembangunan bahagian belakangC++Bagaimanakah saya boleh mengesan perubahan fail dengan cekap pada volum NTFS menggunakan fungsi FSCTL_ENUM_USN_DATA?

How can I efficiently detect file changes on an NTFS volume using the FSCTL_ENUM_USN_DATA function?

Mengesan Perubahan pada Kelantangan: Penyelesaian Terperinci

Untuk mengesan pemadaman, pengubahsuaian dan penciptaan fail secara berkesan pada volum NTFS, anda boleh gunakan fungsi FSCTL_ENUM_USN_DATA. Pendekatan ini menawarkan beberapa kelebihan:

  • Penghitungan Pantas: Ia mengimbas volum dengan cekap, mengambil hanya fail sedia ada dengan prestasi lebih 6000 rekod sesaat.
  • Maklumat Terperinci: Ia menyediakan data yang komprehensif, termasuk bendera fail dan USN, membolehkan kaedah pengesanan perubahan yang tepat.
  • Data Fail Hierarki: Dengan memadankan ID induk dengan ID fail, anda boleh membina semula laluan fail lengkap untuk setiap fail yang dikesan.

Langkah Pelaksanaan:

  1. Enumerate Files: Gunakan FSCTL_ENUM_USN_DATA untuk mendapatkan semula rekod bagi semua fail sedia ada.
  2. Kenalpasti Perubahan: Analisis bendera fail dan USN untuk menentukan fail mana yang telah diubah suai, dibuat atau dipadamkan.
  3. Bina semula Laluan Fail: Padankan ID induk dengan ID fail untuk mendapatkan laluan penuh fail yang terjejas.

Contoh program C yang menunjukkan pendekatan ini disediakan di bawah, mencari fail bernama "test .txt" dan memaparkan maklumat tentang perubahan dan direktori induk mereka:

<code class="c++">#include <windows.h>
#include <stdio.h>

#define BUFFER_SIZE (1024 * 1024)

int main() {
  HANDLE drive = CreateFileW(L"\\?\c:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, NULL);

  MFT_ENUM_DATA mft_enum_data;
  USN maxusn;
  USN_RECORD *record;

  // Query USN journal for information
  if (DeviceIoControl(drive, FSCTL_QUERY_USN_JOURNAL, NULL, 0, &maxusn, sizeof(USN), NULL, NULL)) {
    mft_enum_data.StartFileReferenceNumber = 0;
    mft_enum_data.LowUsn = 0;
    mft_enum_data.HighUsn = maxusn;
    
    DWORDLONG nextid, filecount = 0;

    for (;;) {
      void *buffer = VirtualAlloc(NULL, BUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

      if (DeviceIoControl(drive, FSCTL_ENUM_USN_DATA, &mft_enum_data, sizeof(mft_enum_data), buffer, BUFFER_SIZE, NULL, NULL)) {
        nextid = *((DWORDLONG *)buffer);

        record = (USN_RECORD *)((USN *)buffer + 1);
        while (record FileNameOffset);
          if (wcsncmp(filename, L"test.txt", 8) == 0) {
            printf("=================================================================\n");
            printf("RecordLength: %u\n", record->RecordLength);
            printf("MajorVersion: %u\n", (DWORD)record->MajorVersion);
            printf("MinorVersion: %u\n", (DWORD)record->MinorVersion);
            printf("FileReferenceNumber: %lu\n", record->FileReferenceNumber);
            printf("ParentFRN: %lu\n", record->ParentFileReferenceNumber);
            printf("USN: %lu\n", record->Usn);
            printf("Timestamp: %lu\n", record->TimeStamp);
            printf("Reason: %u\n", record->Reason);
            printf("SourceInfo: %u\n", record->SourceInfo);
            printf("SecurityId: %u\n", record->SecurityId);
            printf("FileAttributes: %x\n", record->FileAttributes);
            printf("FileNameLength: %u\n", (DWORD)record->FileNameLength);
            printf("FileName: %.*ls\n", record->FileNameLength, filename);
            
            // Reconstruct file path by matching parent file reference numbers
            DWORD bytecount;
            if (DeviceIoControl(drive, FSCTL_ENUM_USN_DATA, &mft_enum_data, sizeof(mft_enum_data), buffer, BUFFER_SIZE, &bytecount, NULL)) {
              USN_RECORD *parent_record = (USN_RECORD *)((USN *)buffer + 1);
              if (parent_record->FileReferenceNumber == record->ParentFileReferenceNumber) {
                printf("Parent File:\n");
                printf("=================================================================\n");
                printf("FileName: %.*ls\n", parent_record->FileNameLength, (WCHAR *)(((BYTE *)parent_record) + parent_record->FileNameOffset));
              }
            }
          }
          record = (USN_RECORD *)(((BYTE *)record) + record->RecordLength);
        }
        mft_enum_data.StartFileReferenceNumber = nextid;
      } else {
        printf("FSCTL_ENUM_USN_DATA failed\n");
        break;
      }
      if (nextid == 0) break;
    }
    printf("Total Files: %lu\n", filecount);
  } else {
    printf("FSCTL_QUERY_USN_JOURNAL failed\n");
  }

  if (drive != INVALID_HANDLE_VALUE)
    CloseHandle(drive);

  return 0;
}</stdio.h></windows.h></code>

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengesan perubahan fail dengan cekap pada volum NTFS menggunakan fungsi FSCTL_ENUM_USN_DATA?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimana untuk melaksanakan reka bentuk yang digabungkan dengan longgar di C?Bagaimana untuk melaksanakan reka bentuk yang digabungkan dengan longgar di C?Apr 28, 2025 pm 09:42 PM

Untuk melaksanakan reka bentuk gandingan longgar di C, anda boleh menggunakan kaedah berikut: 1. Gunakan antara muka, seperti menentukan antara muka logger dan melaksanakan filelogger dan consolelogger; 2. Suntikan ketergantungan, seperti kelas DataAccess menerima penunjuk pangkalan data melalui pembina; 3. Corak pemerhati, seperti kelas subjek memberitahu ConcreteObserver dan lain -lain. Melalui teknologi ini, kebergantungan antara modul dapat dikurangkan dan kebolehkerjaan dan fleksibiliti kod dapat ditingkatkan.

Apakah pengecualian kod neutral dalam c?Apakah pengecualian kod neutral dalam c?Apr 28, 2025 pm 09:39 PM

Kod pengecualian-neutral merujuk kepada coretan kod yang tidak melemparkan atau mengendalikan pengecualian. Dalam pengaturcaraan C, menggunakan pengecualian kod neutral dapat memudahkan logik pengendalian pengecualian dan meningkatkan pemeliharaan kod dan kebolehpercayaan.

Bagaimana cara menggunakan templat dalam c?Bagaimana cara menggunakan templat dalam c?Apr 28, 2025 pm 09:21 PM

C Templat digunakan untuk melaksanakan pengaturcaraan generik, yang membolehkan penulisan kod umum. 1) Tentukan fungsi templat, seperti fungsi maksimum, yang sesuai untuk sebarang jenis. 2) Buat kelas templat, seperti kelas kontena umum. 3) Perhatikan instansiasi templat, masa penyusunan, pengkhususan templat, debugging dan maklumat ralat. 4) Ikuti amalan terbaik, pastikan kod mudah, dan pertimbangkan untuk menggunakan parameter templat kekangan.

Bagaimana untuk melaksanakan struktur data bebas kunci dalam C?Bagaimana untuk melaksanakan struktur data bebas kunci dalam C?Apr 28, 2025 pm 09:15 PM

Melaksanakan struktur data bebas kunci dalam C boleh dicapai dengan menggunakan operasi atom dan operasi CAS. Langkah -langkah khusus termasuk: 1. Gunakan std :: atom untuk memastikan operasi atom kepala dan ekor; 2. Gunakan PRESSERE_EXCHANGE_STRONG untuk melaksanakan operasi CAS untuk memastikan konsistensi data; 3. Gunakan std :: shared_ptr untuk menguruskan data nod untuk mengelakkan kebocoran memori.

Bagaimana cara menggunakan aliran rentetan di C?Bagaimana cara menggunakan aliran rentetan di C?Apr 28, 2025 pm 09:12 PM

Langkah -langkah utama dan langkah berjaga -jaga untuk menggunakan aliran rentetan dalam C adalah seperti berikut: 1. Buat aliran rentetan output dan tukar data, seperti menukar integer ke dalam rentetan. 2. Memohon untuk berseri struktur data kompleks, seperti menukar vektor ke dalam rentetan. 3. Beri perhatian kepada isu -isu prestasi dan mengelakkan penggunaan aliran rentetan yang kerap apabila memproses sejumlah besar data. Anda boleh mempertimbangkan menggunakan kaedah tambahan std :: string. 4. Perhatikan pengurusan ingatan dan elakkan penciptaan dan pemusnahan objek stream rentetan yang kerap. Anda boleh menggunakan semula atau menggunakan std :: stringstream.

Apakah analisis statik dalam c?Apakah analisis statik dalam c?Apr 28, 2025 pm 09:09 PM

Penggunaan analisis statik di C terutamanya termasuk menemui masalah pengurusan memori, memeriksa kesilapan logik kod, dan meningkatkan keselamatan kod. 1) Analisis statik dapat mengenal pasti masalah seperti kebocoran memori, siaran berganda, dan penunjuk yang tidak dikenali. 2) Ia dapat mengesan pembolehubah yang tidak digunakan, kod mati dan percanggahan logik. 3) Alat analisis statik seperti perlindungan dapat mengesan limpahan penampan, limpahan integer dan panggilan API yang tidak selamat untuk meningkatkan keselamatan kod.

Apakah aliran memori di C?Apakah aliran memori di C?Apr 28, 2025 pm 09:03 PM

Aliran memori di C merujuk kepada teknologi yang menggunakan STD :: Stringstream, STD :: Istringstream dan STD :: Ostringstream kelas untuk membaca dan menulis data dalam ingatan. 1) STD :: Stringstream boleh digunakan untuk membaca dan menulis, std :: istringstream digunakan untuk membaca, dan std :: ostringstream digunakan untuk menulis. 2) Menggunakan aliran memori boleh meningkatkan prestasi pemprosesan data, tetapi anda perlu memberi perhatian kepada penggunaan memori. 3) Untuk meningkatkan kebolehbacaan kod, adalah disyorkan untuk menambah komen dan dokumen terperinci.

Apakah alat pengurusan pakej di C?Apakah alat pengurusan pakej di C?Apr 28, 2025 pm 08:54 PM

Alat pengurusan pakej C terutamanya termasuk peruntukan VCPKG, CONAN dan CMAKE. 1.VCPKG sesuai untuk projek besar dan senario pelbagai ketergantungan, dan mudah digunakan. 2.Conan menekankan fleksibiliti dan penyesuaian, sesuai untuk projek yang memerlukan kawalan versi yang ketat. 3.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular