Funzione ReadDirectoryChangesExW (winbase.h)
Recupera informazioni che descrivono le modifiche all'interno della directory specificata, che possono includere informazioni estese se tale tipo di informazioni è specificato. La funzione non segnala le modifiche apportate alla directory specificata.
Per tenere traccia delle modifiche in un volume, vedere Modificare i journal.
Sintassi
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
);
Parametri
[in] hDirectory
Handle della directory da monitorare. Questa directory deve essere aperta con il diritto di accesso FILE_LIST_DIRECTORY o un diritto di accesso, ad esempio GENERIC_READ che include il diritto di accesso FILE_LIST_DIRECTORY .
[out] lpBuffer
Puntatore al buffer formattato con allineamento DWORD in cui ReadDirectoryChangesExW deve restituire i risultati di lettura. La struttura di questo buffer viene definita dalla struttura FILE_NOTIFY_EXTENDED_INFORMATION se il valore del parametro ReadDirectoryNotifyInformationClass è ReadDirectoryNotifyExtendedInformation o dalla struttura FILE_NOTIFY_INFORMATION se ReadDirectoryNotifyInformationClass è ReadDirectoryNotifyInformationInformation.
Questo buffer viene riempito in modo sincrono o asincrono, a seconda della modalità di apertura della directory e del valore assegnato al parametro lpOverlapped . Per altre informazioni, vedere la sezione Osservazioni.
[in] nBufferLength
Dimensione del buffer a cui punta il parametro lpBuffer , in byte.
[in] bWatchSubtree
Se questo parametro è TRUE, la funzione monitora l'albero di directory rooted nella directory specificata. Se questo parametro è FALSE, la funzione monitora solo la directory specificata dal parametro hDirectory .
[in] dwNotifyFilter
Criteri di filtro controllati dalla funzione per determinare se l'operazione di attesa è stata completata. Questo parametro può essere uno o più dei valori seguenti.
[out, optional] lpBytesReturned
Per le chiamate sincrone, questo parametro riceve il numero di byte trasferiti nel parametro lpBuffer . Per le chiamate asincrone, questo parametro non è definito. Per recuperare il numero di byte trasferiti, è necessario utilizzare una tecnica di notifica asincrona.
[in, out, optional] lpOverlapped
Puntatore a una struttura OVERLAPPED che fornisce dati da utilizzare durante l'operazione asincrona. In caso contrario, questo valore è NULL. I membri Offset e OffsetHigh di questa struttura non vengono utilizzati.
[in, optional] lpCompletionRoutine
Puntatore a una routine di completamento da chiamare quando l'operazione è stata completata o annullata e il thread chiamante si trova in uno stato di attesa di avviso. Per altre informazioni su questa routine di completamento, vedere FileIOCompletionRoutine.
[in] ReadDirectoryNotifyInformationClass
Tipo di informazioni che ReadDirectoryChangesExW deve scrivere nel buffer in cui punta il parametro lpBuffer . Specificare ReadDirectoryNotifyInformation per indicare che le informazioni devono essere costituite da strutture FILE_NOTIFY_INFORMATION o ReadDirectoryNotifyExtendedInformation per indicare che le informazioni devono essere costituite da strutture FILE_NOTIFY_EXTENDED_INFORMATION.
Valore restituito
Se la funzione ha esito positivo, il valore restituito è diverso da zero. Per le chiamate sincrone, significa che l'operazione è riuscita. Per le chiamate asincrone, indica che l'operazione è stata accodata correttamente.
Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.
Se il redirector di rete o il file system di destinazione non supporta questa operazione, la funzione ha esito negativo con ERROR_INVALID_FUNCTION.
Commenti
Per ottenere un handle in una directory, usare la funzione CreateFile con il flag FILE_FLAG_BACKUP_SEMANTICS .
Una chiamata a ReadDirectoryChangesExW può essere completata in modo sincrono o asincrono. Per specificare il completamento asincrono, aprire la directory con CreateFile come illustrato in precedenza, ma specificare anche l'attributo FILE_FLAG_OVERLAPPED nel parametro dwFlagsAndAttributes . Specificare quindi una struttura OVERLAPPED quando si chiama ReadDirectoryChangesExW.
Quando si chiama ReadDirectoryChangesExW per la prima volta, il sistema alloca un buffer per archiviare le informazioni sulle modifiche. Questo buffer è associato all'handle di directory fino a quando non viene chiuso e le relative dimensioni non cambiano durante la durata. Le modifiche alla directory che si verificano tra le chiamate a questa funzione vengono aggiunte al buffer e quindi restituite con la chiamata successiva. Se l'overflow del buffer, ReadDirectoryChangesExW restituirà comunque true, ma l'intero contenuto del buffer viene eliminato e il parametro lpBytesReturned sarà zero, che indica che il buffer era troppo piccolo per contenere tutte le modifiche apportate.
Al termine del completamento sincrono, il parametro lpBuffer è un buffer formattato e il numero di byte scritti nel buffer è disponibile in lpBytesReturned. Se il numero di byte trasferiti è pari a zero, il buffer è troppo grande per consentire al sistema di allocare o troppo piccolo per fornire informazioni dettagliate su tutte le modifiche apportate nella directory o nel sottoalbero. In questo caso, è necessario calcolare le modifiche enumerando la directory o il sottoalbero.
Per il completamento asincrono, è possibile ricevere una notifica in uno dei tre modi seguenti:
- Uso della funzione GetOverlappedResult . Per ricevere una notifica tramite GetOverlappedResult, non specificare una routine di completamento nel parametro lpCompletionRoutine . Assicurarsi di impostare il membro hEvent della struttura OVERLAPPED su un evento univoco.
- Uso della funzione GetQueuedCompletionStatus . Per ricevere una notifica tramite GetQueuedCompletionStatus, non specificare una routine di completamento in lpCompletionRoutine. Associare l'handle di directory hDirectory a una porta di completamento chiamando la funzione CreateIoCompletionPort .
- Utilizzo di una routine di completamento. Per ricevere una notifica tramite una routine di completamento, non associare la directory a una porta di completamento. Specificare una routine di completamento in lpCompletionRoutine. Questa routine viene chiamata ogni volta che l'operazione è stata completata o annullata mentre il thread si trova in uno stato di attesa di avviso. Il membro hEvent della struttura OVERLAPPED non viene usato dal sistema, quindi è possibile usarlo autonomamente.
ReadDirectoryChangesExW ha esito negativo con ERROR_INVALID_PARAMETER quando la lunghezza del buffer è maggiore di 64 KB e l'applicazione monitora una directory in rete. Ciò è dovuto a una limitazione delle dimensioni dei pacchetti con i protocolli di condivisione file sottostanti.
ReadDirectoryChangesExW ha esito negativo con ERROR_NOACCESS quando il buffer non è allineato su un limite DWORD .
ReadDirectoryChangesExW ha esito negativo con ERROR_NOTIFY_ENUM_DIR quando il sistema non è riuscito a registrare tutte le modifiche apportate alla directory. In questo caso, è necessario calcolare le modifiche enumerando la directory o il sottoalbero.
Se il file è stato aperto usando il nome breve, è possibile ricevere notifiche di modifica per il nome breve.
ReadDirectoryChangesExW è attualmente supportato solo per il file system NTFS.
Operazioni transazionate
Se è presente una transazione associata all'handle della directory, le notifiche seguono le regole di isolamento delle transazioni appropriate.Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 10 versione 1709 [solo app desktop] |
Server minimo supportato | Windows Server 2019 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | winbase.h (include Windows.h) |
Libreria | Kernel32.lib |
DLL | Kernel32.dll |
Vedere anche
Funzioni di gestione delle directory