watcher net ejemplo c# .net windows-8

c# - filesystemwatcher vb.net ejemplo



¿Por qué se detectan cambios en el atributo FileSystemWatcher en Windows 7 pero no en Windows 8? (5)

Compruebe el bit de archivo en el archivo antes / después de editarlo. Su código solo busca los cambios de Atributos, así que supongo que Windows 7 está actualizando el bit de Archivo en el archivo y Windows 8 no.

Tengo un código que usa FileSystemWatcher para monitorear cambios de archivos fuera de mi aplicación.

En Windows 7, con .NET 4, el código siguiente detectaría cuándo se había editado y se había guardado un archivo en una aplicación como el Bloc de notas, mientras se ejecutaba mi aplicación. Sin embargo, esta lógica no funciona con .NET 4 en Windows 8. Específicamente, el evento Cambiado FileSystemWatcher nunca se dispara.

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!"); } }

Entiendo que puedo modificar NotifyFilter para incluir también NotifyFilters.LastWrite, que puede resolver mi problema. Sin embargo, quiero entender por qué este código funcionó en Windows 7 pero ahora no se puede iniciar el evento Changed en Windows 8 . También tengo curiosidad por saber si hay una manera de restaurar mi comportamiento de Windows 7 FileSystemWatcher cuando se ejecuta en Windows 8 (sin cambiar NotifyFilter).


FileSystemWatcher es notoriamente poco confiable. Intenta suscribirte a todos los eventos y ver si los demás disparan. Una cosa que podría intentar es usar un temporizador para examinar el archivo en busca de cambios a intervalos regulares, por ejemplo una vez cada dos segundos, en lugar de utilizar FileSystemWatcher.


Hay demasiados comentarios en todas partes, solo agregaré una respuesta para verificar que tenga conocimiento de los siguientes problemas:

Aparentemente, el problema es que el evento se genera en un subproceso en segundo plano, y es necesario ordenar la devolución de llamada al subproceso de interfaz de usuario.

He experimentado muchos problemas con la clase FileSystemWatcher y decidí no usarlo como puede verme describir aquí: https://.com/a/22768610/129130 . Sin embargo, es posible que los problemas que experimenté se debieran a problemas de sincronización de subprocesos y / o problemas de hardware.


No sé por qué, pero creo que en Windows 8.1

NotifyFilters.LastWrite (Evento modificado) de la clase FileSystemWatcher se activará

  • si controlo el directorio dentro de mi escritorio (C: / Users / [user] / Desktop).

el evento no se disparará

  • si controlo el directorio de archivos de programa (C: / Archivos de programa (x86))

Puede estar relacionado con el permiso pero no sé cómo configurarlo, ambas condiciones se ejecutan bajo el administrador


Yo tuve el mismo problema. Esta clase parece funcionar en mi computadora con Windows 8:

https://.com/a/23743268/637142

La razón por la que uso esa clase es porque se comporta igual en Windows 7 y Windows 8.