Notification lorsqu'un fichier change?

113

Existe-t-il un mécanisme par lequel je peux être averti (en C #) lorsqu'un fichier est modifié sur le disque?

PaulB
la source
1
Consultez cette réponse pour plus d'informations sur la classe FileSystemWatcher et les événements qu'elle déclenche.
ChrisF

Réponses:

206

Vous pouvez utiliser la FileSystemWatcherclasse.

public void CreateFileWatcher(string path)
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = path;
    /* 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;
}

// 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);
}
Dirk Vollmar
la source
11
Merci pour le bel exemple. Je soulignerai également que vous pouvez utiliser la méthode WaitForChanged sur FileSystemWatcher si vous recherchez un moyen bloquant (synchrone) de surveiller les changements.
Mark Meuer
22
Merci pour cet exemple. Le MSDN a à peu près la même chose ici . De plus, certaines personnes voudront peut-être regarder toute une arborescence de répertoires - utilisez-la watcher.IncludeSubdirectories = true;pour y parvenir.
Oliver
1
OnChangese déclenche sans changement réel ( par exemple: frapper ctrl+ssans changement réel ), existe-t-il un moyen de détecter de faux changements?
Mehdi Dehghani
1
@MehdiDehghani: Pas que je sache, le seul moyen semble être de conserver un instantané du fichier et de comparer cet octet à la version actuelle (probablement modifiée). Le FileSystemWatcherseul est capable de détecter des événements au niveau du système de fichiers (c'est-à-dire si le système d'exploitation déclenche un événement). Dans votre cas, Ctrl + S déclenche un tel événement (que cela se produise ou non dépend de l'application réelle).
Dirk Vollmar
FileSystemWatcher est-il multiplateforme?
Vinigas le
5

Utilisez le FileSystemWatcher. Vous pouvez filtrer uniquement les événements de modification.

Karité
la source