FileSystemWatcher, classe
Assembly : System (dans system.dll)
Utilisez FileSystemWatcher pour assurer le suivi des modifications dans un répertoire spécifié. Vous pouvez également effectuer le suivi des modifications apportées aux fichiers et aux sous-répertoires du répertoire spécifié. Vous pouvez créer un composant pour faire le suivi de fichiers sur un ordinateur local, un lecteur réseau ou un ordinateur distant.
Pour assurer le suivi des modifications dans tous les fichiers dotés d'une extension de fichier, affectez une chaîne vide ("") à la propriété Filter ou utilisez des caractères génériques ("*.*"). Pour effectuer le suivi d'un fichier spécifique, assignez le nom de ce fichier à la propriété Filter. Par exemple, pour surveiller les modifications apportées au fichier MonDoc.txt, la valeur de la propriété Filter doit être "MonDoc.txt". Vous pouvez également surveiller les modifications apportées à un type spécifique de fichier. Par exemple, pour effectuer le suivi des modifications des fichiers texte, assignez la valeur "*.txt" à la propriété Filter.
Vous pouvez également effectuer le suivi de plusieurs types de modifications dans un même répertoire ou fichier. Par exemple, il est possible de surveiller les modifications de Attributes, de date et d'heure de LastWrite ou de Size de fichiers et de répertoires. Ceci se fait en affectant une des valeurs NotifyFilters à la propriété NotifyFilter. Pour plus d'informations sur les types de modifications pouvant être suivis, consultez NotifyFilters.
Vous pouvez en outre effectuer le suivi des attributions de nouveaux noms de fichiers et de répertoires, de même que leur création ou leur suppression. Par exemple, pour effectuer le suivi de l'attribution d'un nouveau nom à des fichiers texte, affectez la valeur "*.txt" à la propriété Filter et appelez la méthode WaitForChanged avec un Renamed spécifié pour son paramètre.
Le système d'exploitation Windows notifie votre composant de modifications apportées aux fichiers dans une mémoire tampon créée par FileSystemWatcher. Si plusieurs modifications sont apportées en un court laps de temps, la mémoire tampon risque de déborder. Le composant risque alors de perdre la trace des modifications apportées au répertoire et ne donnera qu'une notification standard. L'augmentation de la taille de la mémoire tampon par le biais de la propriété InternalBufferSize est coûteuse car elle provient d'une mémoire non paginée ne pouvant pas être transférée sur le disque. Ne saturez donc pas la mémoire tampon et veillez à ce qu'elle soit suffisamment grande pour ne manquer aucun événement de modification de fichier. Pour éviter une saturation de la mémoire tampon, utilisez les propriétés NotifyFilter et IncludeSubdirectories pour filtrer les notifications de modifications inutiles.
Pour obtenir la liste des valeurs initiales des propriétés d'une instance de FileSystemWatcher, consultez le constructeur FileSystemWatcher.
Notez les points suivants lors de l'utilisation de la classe FileSystemWatcher.
-
Les fichiers cachés ne sont pas ignorés.
-
Sur certains systèmes, FileSystemWatcher signale des modifications apportées aux fichiers utilisant le format de nom de fichier 8.3 court. Par exemple, une modification apportée à "LongFileName.LongExtension" peut être signalée comme "LongFi~.Lon".
-
Cette classe contient une demande de liaison et une demande d'héritage au niveau de la classe qui s'applique à tous les membres. Une exception SecurityException est levée lorsque l'appelant immédiat ou la classe dérivée ne dispose pas d'une autorisation avec un niveau de confiance total. Pour plus d'informations sur les demandes de sécurité, consultez Demandes de liaison.
Copie et déplacement de dossiers
Le système d'exploitation et l'objet FileSystemWatcher interprètent une action couper-coller ou une action de déplacement comme une action d'attribution d'un nouveau nom pour un dossier et son contenu. Si vous coupez et collez un dossier avec des fichiers dans un dossier suivi, l'objet FileSystemWatcher signale uniquement le dossier comme étant nouveau, et pas son contenu car les fichiers sont essentiellement renommés.
Si vous souhaitez être notifié du déplacement ou de la copie du contenu de dossiers dans un dossier suivi, fournissez les méthodes de gestionnaire d'événements OnChanged et OnRenamed, comme indiqué dans le tableau suivant.
| Gestionnaire d'événements | Événements gérés | Action |
|---|---|---|
| OnChanged | Signale les modifications apportées aux attributs de fichier, aux fichiers créés et aux fichiers supprimés. | |
| OnRenamed | Répertorie les anciens et nouveaux chemins d'accès des fichiers et des dossiers renommés, que vous pouvez développer de manière récursive si nécessaire. |
Événements et tailles de mémoire tampon
Notez que plusieurs facteurs peuvent affecter les événements de modification du système de fichiers qui sont déclenchés, tel que décrit ci-après :
-
Des opérations courantes du système de fichiers peuvent déclencher plusieurs événements. Par exemple, lorsqu'un fichier est déplacé d'un répertoire vers un autre, plusieurs événements OnChanged ainsi que quelques événements OnCreated et OnDeleted peuvent être déclenchés. Le déplacement d'un fichier est une opération complexe qui consiste en plusieurs opérations simples, déclenchant donc plusieurs événements. De la même façon, certaines applications (par exemple, des logiciels antivirus) peuvent entraîner des événements de système de fichiers supplémentaires qui sont détectés par FileSystemWatcher.
-
FileSystemWatcher peut assurer le suivi de disquettes, tant que celles-ci ne sont pas permutées ou retirées du lecteur. FileSystemWatcher ne déclenche pas d'événements pour les CD-ROM et les DVD, car les informations de date et les propriétés ne peuvent pas être modifiées. Pour que le composant fonctionne correctement, une des plates-formes requises doit être installée sur les ordinateurs distants. Toutefois, vous ne pouvez pas assurer le suivi d'un ordinateur distant sur lequel est exécuté Windows NT 4 0 à partir d'un ordinateur Windows NT 4 0.
-
Si plusieurs objets FileSystemWatcher assurent le suivi du même chemin UNC dans Windows XP avant le Service Pack 1, ou Windows 2000 SP2 ou version antérieure, seul l'un des objets déclenchera un événement. Sur les ordinateurs Windows XP SP1 et versions ultérieures, Windows 2000 SP3 ou version ultérieure, ou Windows Server 2003, tous les objets FileSystemWatcher déclencheront les événements appropriés.
-
L'utilisation de Filter ne réduit pas la taille des données placées dans la mémoire tampon.
Notez que FileSystemWatcher ne déclenche pas d'événement Error lorsqu'un événement est omis ou lorsque la taille de la mémoire tampon est dépassée à cause de dépendances avec le système d'exploitation Windows. Pour ne pas manquer d'événements, suivez ces indications :
-
L'augmentation de la taille de la mémoire tampon avec la propriété InternalBufferSize peut empêcher l'omission d'événements de modification du système de fichiers.
-
Évitez d'assurer le suivi de fichiers avec des noms de fichiers longs. Envisagez de renommer les fichiers à l'aide de noms plus courts.
-
Gardez votre code de gestion des événements aussi court que possible.
L'exemple suivant crée un FileSystemWatcher pour surveiller le répertoire spécifié au moment de l'exécution. Le composant est défini pour surveiller les modifications de l'heure de LastWrite et de LastAccess, la création ou la suppression d'un nom de fichier texte ou l'attribution d'un nouveau nom de fichier texte dans le répertoire. Si un fichier est modifié, créé ou supprimé, le chemin d'accès au fichier s'imprime dans la console. Lorsqu'un fichier est renommé, l'ancien et le nouveau chemin d'accès s'impriment dans la console.
Utilisez les espaces de noms System.Diagnostics et System.IO pour cet exemple.
public class Watcher { public static void Main() { Run(); } [PermissionSet(SecurityAction.Demand, Name="FullTrust")] public static void Run() { string[] args = System.Environment.GetCommandLineArgs(); // If a directory is not specified, exit program. if(args.Length != 2) { // Display the proper way to call the program. Console.WriteLine("Usage: Watcher.exe (directory)"); return; } // Create a new FileSystemWatcher and set its properties. FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = args[1]; /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */ watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Only watch text files. watcher.Filter = "*.txt"; // Add event handlers. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; // Wait for the user to quit the program. Console.WriteLine("Press \'q\' to quit the sample."); while(Console.Read()!='q'); } // Define the event handlers. private static void OnChanged(object source, FileSystemEventArgs e) { // Specify what is done when a file is changed, created, or deleted. Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); } private static void OnRenamed(object source, RenamedEventArgs e) { // Specify what is done when a file is renamed. Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); } }
public class Watcher
{
public static void main(String[] args1)
{
Run();
}
/** @attribute PermissionSet(SecurityAction.Demand, Name="FullTrust")
*/
public static void Run()
{
String args[] = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if (args.length != 2) {
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.set_Path(args[1]);
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories.
*/
watcher.set_NotifyFilter
(NotifyFilters.LastAccess |NotifyFilters.LastWrite |
NotifyFilters.FileName | NotifyFilters.DirectoryName);
// Only watch text files.
watcher.set_Filter("*.txt");
// Add event handlers.
watcher.add_Changed(new FileSystemEventHandler(OnChanged));
watcher.add_Created(new FileSystemEventHandler(OnChanged));
watcher.add_Deleted(new FileSystemEventHandler(OnChanged));
watcher.add_Renamed(new RenamedEventHandler(OnRenamed));
// Begin watching.
watcher.set_EnableRaisingEvents(true);
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while ((Console.Read() != 'q')) {
}
}
// Define the event handlers.
private static void OnChanged(Object source,FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine(("File: " + e.get_FullPath() + " "
+ e.get_ChangeType()));
} //OnChanged
private static void OnRenamed(Object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}",
e.get_OldFullPath(),e.get_FullPath());
} //OnRenamed
} //Watcher
- SecurityPermission pour appeler des membres de ProcessStartInfo. Valeur de demande : LinkDemand ; Jeux d'autorisations nommés : FullTrust.
- SecurityPermission pour dériver de la classe ProcessStartInfo. Valeur de demande : InheritanceDemand ; Jeux d'autorisations nommés : FullTrust.
Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition
Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.
Référence
Membres FileSystemWatcherSystem.IO, espace de noms
FileSystemWatcher.NotifyFilter
NotifyFilters
FileSystemEventArgs, classe
FileSystemEventHandler, délégué
Filter
IncludeSubdirectories
InternalBufferOverflowException
RenamedEventArgs
RenamedEventHandler
WaitForChangedResult
WatcherChangeTypes
- 23/09/2011
- Vincent Godin FR