incendios FileSystemWatcher.Changed inmediatamente cuando se abre Excel 2007 archivo XLS en modo de compatibilidad

StackOverflow https://stackoverflow.com/questions/2403698

Pregunta

Utilizamos una FileSystemWatcher para controlar documentos abiertos de nuestro sistema de gestión de documentos, y si el usuario guarda el documento, nos preguntamos si les gusta también actualizados en nuestro sistema.

Tenemos un problema con los archivos XLS en Excel 2007 (no ha comprobado que el problema no existe en 2003, pero sólo parece ser archivos que se abren en modo de compatibilidad en 2007) donde se activa el acontecimiento cambió inmediatamente después de la apertura de la archivo, y luego una vez más al cerrar el archivo, aunque nada ha cambiado o si el usuario opta por no salvar al cierre. Este mismo comportamiento no existe al abrir archivos XLSX.

Me escribió una aplicación de prueba para verificar el comportamiento, que se puede encontrar en ( http: / /www.just2guys.net/SOFiles/FSWExcel.zip ). En la aplicación, hay uno para cada tipo FileSystemWatcher NotifyFilter, por lo que es evidente ¿Por qué el evento que cambió fue despedido.

De cualquier forma que se pueda imaginar para solamente pedir al usuario cuando el documento se guarda realmente de alguna manera por el usuario? Puedo empezar a monitorizar el archivo después de Process.Start se llama, que me permite saltar el mensaje al abrir el documento, pero todavía conseguir uno al cerrar el documento, incluso cuando no se cambió nada.

¿Fue útil?

Solución

Me di cuenta de esto con la Palabra, y se puede reproducir simplemente que:

Si abre un archivo .doc o un archivo .xls con una aplicación de Office, los cambios de fecha y hora a la vez que el documento se abrió.

Si cierra la aplicación, la marca de tiempo se restablece a su valor original (sólo si se ha guardado ONT).

Así que para los archivos de Office, se necesitan dos controles adicionales:

  • en abierto, cuando se establece marca de tiempo a la hora, compruebe que el archivo se puede abrir exclusivamente

  • en Cerrar, compruebe si la marca de tiempo está "cerca" de la fecha y hora actuales, o compruebe la bandera Archivo del archivo

Otros consejos

FileSystemWatcher es generalmente mal. Se quema una gran cantidad de personas, ya que registra los eventos antes de que el archivo está completamente escrito.

Hemos sido capaces de conseguir alrededor de él, ya sea por la eliminación en lugar de un patrón de bucle de sueño, añadiendo un retardo estático (Thread.Sleep) antes de actuar, o una combinación de los dos (recibir el evento, generando un hilo y un bucle en el hilo hasta que usted piensa que nada es la actualización marcando la última mod fecha / hora).

Excel crea un archivo temporal cada vez que se abre un archivo - este es probablemente el evento que está viendo. Compruebe la propiedad Nombre de FileSystemEventArgs e ignorar el evento si el nombre del archivo comienza con '~'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top