Fungsi ReadDirectoryChangesExW (winbase.h)
Mengambil informasi yang menjelaskan perubahan dalam direktori yang ditentukan, yang dapat menyertakan informasi yang diperluas jika jenis informasi tersebut ditentukan. Fungsi tidak melaporkan perubahan pada direktori yang ditentukan itu sendiri.
Untuk melacak perubahan pada volume, lihat mengubah jurnal.
Sintaks
BOOL ReadDirectoryChangesExW(
[in] HANDLE hDirectory,
[out] LPVOID lpBuffer,
[in] DWORD nBufferLength,
[in] BOOL bWatchSubtree,
[in] DWORD dwNotifyFilter,
[out, optional] LPDWORD lpBytesReturned,
[in, out, optional] LPOVERLAPPED lpOverlapped,
[in, optional] LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
[in] READ_DIRECTORY_NOTIFY_INFORMATION_CLASS ReadDirectoryNotifyInformationClass
);
Parameter
[in] hDirectory
Handel ke direktori yang akan dipantau. Direktori ini harus dibuka dengan hak akses FILE_LIST_DIRECTORY , atau hak akses seperti GENERIC_READ yang menyertakan hak akses FILE_LIST_DIRECTORY .
[out] lpBuffer
Penunjuk ke buffer berformat yang diratakan DWORD di mana ReadDirectoryChangesExW harus mengembalikan hasil baca. Struktur buffer ini ditentukan oleh struktur FILE_NOTIFY_EXTENDED_INFORMATION jika nilai parameter ReadDirectoryNotifyInformationClass adalah ReadDirectoryNotifyExtendedInformation, atau oleh struktur FILE_NOTIFY_INFORMATION jika ReadDirectoryNotifyInformationClass adalah ReadDirectoryNotifyInformation.
Buffer ini diisi secara sinkron atau asinkron, tergantung pada bagaimana direktori dibuka dan nilai apa yang diberikan ke parameter lpOverlapped . Untuk informasi lebih lanjut, lihat bagian Keterangan.
[in] nBufferLength
Ukuran buffer tempat parameter lpBuffer menunjuk, dalam byte.
[in] bWatchSubtree
Jika parameter ini TRUE, fungsi memantau pohon direktori yang berakar pada direktori yang ditentukan. Jika parameter ini FALSE, fungsi hanya memantau direktori yang ditentukan oleh parameter hDirectory .
[in] dwNotifyFilter
Kriteria filter yang diperiksa fungsi untuk menentukan apakah operasi tunggu telah selesai. Parameter ini bisa menjadi satu atau beberapa nilai berikut.
[out, optional] lpBytesReturned
Untuk panggilan sinkron, parameter ini menerima jumlah byte yang ditransfer ke parameter lpBuffer . Untuk panggilan asinkron, parameter ini tidak terdefinisi. Anda harus menggunakan teknik pemberitahuan asinkron untuk mengambil jumlah byte yang ditransfer.
[in, out, optional] lpOverlapped
Penunjuk ke struktur TUMPANG TINDIH yang memasok data yang akan digunakan selama operasi asinkron. Jika tidak, nilai ini NULL. Anggota Offset dan OffsetHigh dari struktur ini tidak digunakan.
[in, optional] lpCompletionRoutine
Penunjuk ke rutinitas penyelesaian untuk dipanggil ketika operasi telah selesai atau dibatalkan dan utas panggilan dalam status tunggu yang dapat diperingatkan. Untuk informasi selengkapnya tentang rutinitas penyelesaian ini, lihat FileIOCompletionRoutine.
[in] ReadDirectoryNotifyInformationClass
Jenis informasi yang harus ditulis ReadDirectoryChangesExW ke buffer tempat parameter lpBuffer menunjuk. Tentukan ReadDirectoryNotifyInformation untuk menunjukkan bahwa informasi harus terdiri dari struktur FILE_NOTIFY_INFORMATION , atau ReadDirectoryNotifyExtendedInformation untuk menunjukkan bahwa informasi harus terdiri dari struktur FILE_NOTIFY_EXTENDED_INFORMATION .
Mengembalikan nilai
Jika fungsi berhasil, nilai yang dikembalikan bukan nol. Untuk panggilan sinkron, ini berarti bahwa operasi berhasil. Untuk panggilan asinkron, ini menunjukkan bahwa operasi berhasil diantrekan.
Jika fungsi gagal, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Jika pengalih jaringan atau sistem file target tidak mendukung operasi ini, fungsi gagal dengan ERROR_INVALID_FUNCTION.
Keterangan
Untuk mendapatkan handel ke direktori, gunakan fungsi CreateFile dengan bendera FILE_FLAG_BACKUP_SEMANTICS .
Panggilan ke ReadDirectoryChangesExW dapat diselesaikan secara sinkron atau asinkron. Untuk menentukan penyelesaian asinkron, buka direktori dengan CreateFile seperti yang ditunjukkan di atas, tetapi juga tentukan atribut FILE_FLAG_OVERLAPPED dalam parameter dwFlagsAndAttributes . Kemudian tentukan struktur YANG TUMPANG TINDIH saat Anda memanggil ReadDirectoryChangesExW.
Ketika Anda pertama kali memanggil ReadDirectoryChangesExW, sistem mengalokasikan buffer untuk menyimpan informasi perubahan. Buffer ini dikaitkan dengan handel direktori hingga ditutup dan ukurannya tidak berubah selama masa pakainya. Perubahan direktori yang terjadi antara panggilan ke fungsi ini ditambahkan ke buffer lalu dikembalikan dengan panggilan berikutnya. Jika buffer meluap, ReadDirectoryChangesExW akan tetap mengembalikan true, tetapi seluruh konten buffer dibuang dan parameter lpBytesReturned akan menjadi nol, yang menunjukkan bahwa buffer Anda terlalu kecil untuk menahan semua perubahan yang terjadi.
Setelah penyelesaian sinkron berhasil, parameter lpBuffer adalah buffer berformat dan jumlah byte yang ditulis ke buffer tersedia di lpBytesReturned. Jika jumlah byte yang ditransfer adalah nol, buffer terlalu besar bagi sistem untuk mengalokasikan atau terlalu kecil untuk memberikan informasi terperinci tentang semua perubahan yang terjadi di direktori atau subtree. Dalam hal ini, Anda harus menghitung perubahan dengan menghitung direktori atau subtree.
Untuk penyelesaian asinkron, Anda dapat menerima pemberitahuan dengan salah satu dari tiga cara:
- Menggunakan fungsi GetOverlappedResult . Untuk menerima pemberitahuan melalui GetOverlappedResult, jangan tentukan rutinitas penyelesaian dalam parameter lpCompletionRoutine . Pastikan untuk mengatur anggota hEvent dari struktur TUMPANG TINDIH ke peristiwa unik.
- Menggunakan fungsi GetQueuedCompletionStatus . Untuk menerima pemberitahuan melalui GetQueuedCompletionStatus, jangan tentukan rutinitas penyelesaian di lpCompletionRoutine. Kaitkan direktori menangani hDirectory dengan port penyelesaian dengan memanggil fungsi CreateIoCompletionPort .
- Menggunakan rutinitas penyelesaian. Untuk menerima pemberitahuan melalui rutinitas penyelesaian, jangan kaitkan direktori dengan port penyelesaian. Tentukan rutinitas penyelesaian dalam lpCompletionRoutine. Rutinitas ini dipanggil setiap kali operasi selesai atau dibatalkan saat utas dalam status tunggu yang dapat diperingatkan. Anggota hEvent dari struktur TUMPANG TINDIH tidak digunakan oleh sistem, sehingga Anda dapat menggunakannya sendiri.
ReadDirectoryChangesExW gagal dengan ERROR_INVALID_PARAMETER ketika panjang buffer lebih besar dari 64 KB dan aplikasi memantau direktori melalui jaringan. Hal ini disebabkan oleh keterbatasan ukuran paket dengan protokol berbagi file yang mendasar.
ReadDirectoryChangesExW gagal dengan ERROR_NOACCESS ketika buffer tidak diselaraskan pada batas DWORD .
ReadDirectoryChangesExW gagal dengan ERROR_NOTIFY_ENUM_DIR ketika sistem tidak dapat merekam semua perubahan ke direktori. Dalam hal ini, Anda harus menghitung perubahan dengan menghitung direktori atau subtree.
Jika Anda membuka file menggunakan nama pendek, Anda dapat menerima pemberitahuan perubahan untuk nama pendek.
ReadDirectoryChangesExW saat ini hanya didukung untuk sistem file NTFS.
Operasi yang Ditransaksikan
Jika ada transaksi yang terikat ke handel direktori, maka pemberitahuan mengikuti aturan isolasi transaksi yang sesuai.Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows 10, versi 1709 [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2019 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | winbase.h (termasuk Windows.h) |
Pustaka | Kernel32.lib |
DLL | Kernel32.dll |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk