UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_ReadDirectoryChanges

Obtient des informations qui décrivent les changements dans un répertoire spécifié

#include <WinAPIFiles.au3>
_WinAPI_ReadDirectoryChanges ( $hDirectory, $iFilter, $pBuffer, $iLength [, $bSubtree = 0] )

Paramètres

$hDirectory Le handle du répertoire à surveiller. Ce répertoire doit être ouvert avec le droit d'accès $FILE_LIST_DIRECTORY.
$iFilter Les critères de filtrage que la fonction teste pour déterminer si l'opération d'attente est terminée.
Ce paramètre peut prendre une ou plusieurs des valeurs suivantes:
$FILE_NOTIFY_CHANGE_FILE_NAME
$FILE_NOTIFY_CHANGE_DIR_NAME
$FILE_NOTIFY_CHANGE_ATTRIBUTES
$FILE_NOTIFY_CHANGE_SIZE
$FILE_NOTIFY_CHANGE_LAST_WRITE
$FILE_NOTIFY_CHANGE_LAST_ACCESS
$FILE_NOTIFY_CHANGE_CREATION
$FILE_NOTIFY_CHANGE_SECURITY
$pBuffer Un pointeur vers le tampon formaté aligné sur un DWORD qui est utilisé en interne par cette fonction pour récupérer les données.
Pour créer un tampon, vous pouvez utiliser la fonction _WinAPI_CreateBuffer().
Pour éviter le crash du script, utiliser un tampon d'au moins 64 Ko.
Si la mémoire tampon est supérieure à 64 Ko et que l'application surveille un répertoire sur un réseau, la fonction échoue.
Ceci est dû à une limitation de la taille de paquet avec les protocoles de partage de fichiers sous-jacents.
$iLength La taille de la mémoire tampon, en octets.
$bSubtree [optionnel] Spécifie si la fonction doit surveiller les sous-répertoires du répertoire spécifié, les valeurs valides sont:
True - Surveille l'arborescence des répertoires don la racine est spécifié.
False - Surveille seulement le dossier spécifié (par défaut).

Valeur de retour

Succès: Retourne le tableau 2D contenant les informations suivantes :
[0][0] - Nombre de lignes dans le tableau (n)
[0][1] - Inutilisé
[n][0] - Le nom de fichier relatif au handle du répertoire.
[n][1] - Le type de changement qui a eu lieu (l'une des constantes $FILE_ACTION_*).
Échec: Définit @error <> 0, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur.

Remarques

Lorsque vous appelez la première fois la fonction _WinAPI_ReadDirectoryChanges(), le système alloue un tampon pour stocker les informations de changement.
Ce tampon est associé au handle du répertoire jusqu'à ce qu'il soit fermé et sa taille ne change pas pendant sa durée de vie.
Les modifications du répertoire qui se produisent entre les appels à cette fonction sont ajoutés au tampon et sont ensuite retournées à l'appel suivant.
S'il y a dépassement de tampon, tout le contenu est rejeté.

Pour obtenir le handle du répertoire, utilisez la fonction _WinAPI_CreateFileEx() avec le flag $FILE_FLAG_BACKUP_SEMANTICS.

La fonction _WinAPI_ReadDirectoryChanges() travaille uniquement en mode synchrone.

En relation

_WinAPI_CreateFileEx

Voir aussi

Consultez ReadDirectoryChangesW dans la librairie MSDN.

Exemple

#include <APIFilesConstants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
#include <WinAPIFiles.au3>
#include <WinAPIMem.au3>

Global $g_sPath = @TempDir & '\~TEST~'

DirCreate($g_sPath)
If Not FileExists($g_sPath) Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de créer le répertoire.')
    Exit
EndIf

OnAutoItExitRegister('OnAutoItExit')

Local $hDirectory = _WinAPI_CreateFileEx($g_sPath, $OPEN_EXISTING, $FILE_LIST_DIRECTORY, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $FILE_FLAG_BACKUP_SEMANTICS)
If @error Then
    _WinAPI_ShowLastError('', 1)
EndIf

Local $pBuffer = _WinAPI_CreateBuffer(8388608)

Local $aData
While 1
    ; La ligne suivante bloque le script jusqu'à un changement dans le dossier surveillé
    $aData = _WinAPI_ReadDirectoryChanges($hDirectory, BitOR($FILE_NOTIFY_CHANGE_FILE_NAME, $FILE_NOTIFY_CHANGE_DIR_NAME), $pBuffer, 8388608, 1)
    If @error = 0 Then
        _ArrayDisplay($aData, '_WinAPI_ReadDirectoryChanges')
    Else
        _WinAPI_ShowLastError('', 1)
    EndIf
WEnd

Func OnAutoItExit()
    DirRemove($g_sPath, 1)
EndFunc   ;==>OnAutoItExit