36 votes

Pourquoi FileSystemWatcher des modifications d'attributs détecté sur Windows 7, mais pas de Windows 8?

J'ai un code qui utilise FileSystemWatcher pour surveiller les modifications de fichiers à l'extérieur de mon application.

Sur Windows 7, l'utilisation .NET 4, le code ci-dessous permettrait de détecter lorsqu'un fichier a été modifié et enregistré dans une application comme le bloc-notes, tandis que mon application est en cours d'exécution. Cependant, cette logique ne fonctionne pas à l'aide .NET 4 sur Windows 8. Plus précisément, le FileSystemWatcher a Changé événement se déclenche jamais.

public static void Main(string[] args)
{
    const string FilePath = @"C:\users\craig\desktop\notes.txt";

    if (File.Exists(FilePath))
    {
        Console.WriteLine("Test file exists.");
    }

    var fsw = new FileSystemWatcher();
    fsw.NotifyFilter = NotifyFilters.Attributes;
    fsw.Path = Path.GetDirectoryName(FilePath);
    fsw.Filter = Path.GetFileName(FilePath);

    fsw.Changed += OnFileChanged;
    fsw.EnableRaisingEvents = true;

    // Block exiting.
    Console.ReadLine();
}

private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
    if (File.Exists(e.FullPath))
    {
        Console.WriteLine("File change reported!");
    }
}

Je comprends que je peux modifier le NotifyFilter d'inclure également NotifyFilters.LastWrite, qui peut résoudre mon problème. Cependant, je veux comprendre pourquoi ce code fonctionnait sur Windows 7, mais est incapable de le feu de l'événement a Changé sur Windows 8. Je suis aussi curieux de savoir si il existe un moyen de restaurer mon Windows 7 FileSystemWatcher comportement lors de l'exécution dans Windows 8 (sans modification de la NotifyFilter).

1voto

Vérifiez le bit d'archive sur le fichier avant/après modification. Votre code est uniquement à la recherche pour les Attributs des changements, donc je pense que Windows 7 est la mise à jour de l'Archive bit sur le fichier, et windows 8 n'est pas.

0voto

alexandrudicu Points 422

FileSystemWatcher est notoirement peu fiables. Essayer de s'abonner à tous les événements et de voir si les autres le feu. Une chose que vous pouvez essayer est d'utiliser une minuterie pour examiner le dossier des changements se produisent à intervalles réguliers, par exemple une fois toutes les deux secondes, au lieu d'utiliser FileSystemWatcher.

0voto

Glytzhkof Points 5037

Il y a trop de commentaires partout, je vais juste ajouter une réponse pour vérifier que vous êtes conscient des problèmes suivants:

Apparemment, le problème est que l'événement est déclenché sur un thread d'arrière-plan, et vous avez besoin pour diriger l'appel vers le thread d'INTERFACE utilisateur.

J'ai connu beaucoup de problèmes avec la classe FileSystemWatcher, et a décidé de ne pas l'utiliser comme vous pouvez le voir moi de décrire ici: http://stackoverflow.com/a/22768610/129130 . Il est possible, cependant, que les problèmes que j'ai connu étaient dus à la synchronisation des threads questions et / ou problèmes de matériel.

0voto

Tono Nam Points 4465

J'ai eu le même problème. Cette classe semble fonctionner sur mon ordinateur windows 8:

http://stackoverflow.com/a/23743268/637142

Pourquoi j'ai l'utilisation de cette classe est parce qu'il se comporte de la même manière sur windows 7 et windows 8.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X