2010-08-09 15 views
8

He encontrado varias "soluciones" aquí y en la web, pero ninguna parece ajustarse a la factura.C#: Supervisión de archivos copiados o movidos con FileSystemWatcher

Lo que estoy buscando es hacer que una aplicación controle una carpeta para nuevos archivos (ya sea por creación, una mudanza o una copia) y realice acciones en esos objetos. Siendo ese el escenario, recurrí a la clase FileSystemWatcher para realizar esta acción.

El problema es que el archivo FileSystemWatcher.Created evento se activa antes de que se cree todo el archivo (más notablemente visto a través de una copia de un archivo grande).

¿Hay alguna forma de tener este evento de incendio al final de la creación del archivo en lugar de al principio? He intentado varias combinaciones de la propiedad FileSystemWatcher.NofityFilter sin éxito.

¡Gracias de antemano! :)

Respuesta

6

he utilizado un par de soluciones para esta situación.

  1. Si puede trabajar con el creador del archivo y utilizar un esquema de cambio de nombre para el archivo. P.EJ. Crear el archivo como __Name_ mientras son creados y al final del proceso de cambiarle el nombre a Nombre y el evento se disparará y usted tiene un archivo completo.

  2. Cuando se activa su disparador, compruebe si puede obtener un bloqueo exclusivo de solo lectura en el archivo. Si puede, entonces la operación de escritura se ha completado en el archivo. (Yo he escrito sobre esto en otra pregunta Keep settings in sync between forms application and windows service (or any n-tier, really))

Usted podría integrar algo así como # 2 en su Cambiado Evento y luego podrás obtener el resultado.

1

Hmm un problema interesante. Nunca usé el objeto mientras miraba archivos grandes. Hice un poco de búsqueda y parece que una solución es monitorear el evento cambiado también. Porque una vez que el archivo se realiza la copia (después de creado se dispara) un evento modificado se lanza también (hacer que el archivo aumentado de tamaño)

Más detalles de lo que leí aquí: http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/f84bb7c8-b7d5-44da-b0f3-6d1a70415d11/

+0

pero lamentablemente no tuve la suerte de encontrar una solución más elegante para esto :((al menos, me gustaría saber) –

0

Debería rastrear el cierre del archivo después de su creación y dudo que sea posible con FileSystemWatcher. Si no encuentra una solución con FileSystemWatcher, eche un vistazo a nuestro producto CallbackFilter, que le permite rastrear todas las operaciones en tiempo real.

+0

Nota: Eugene es CTO de la compañía que escribió CallbackFilter – Crisfole

+0

@ChristopherPfohl Gracias por señalar a la publicación anterior: la actualicé de acuerdo con las nuevas reglas de SO. –

+0

gracias :) La divulgación hace que la decisión de usar su producto sea más fácil para muchas personas. – Crisfole

1

Sé que lo que voy a contarle no se ve elegante. También tuve que monitorear archivos que llegaban de diferentes lugares, algunos de ellos eran grandes y otros pequeños. Descubrimos que FileSystemWatcher no es confiable para este propósito. Si quiere estar 100% seguro, puede verificarlo de vez en cuando, usando la clase de temporizador y su evento transcurrido.

+0

Hola Boris, ¿en qué aspectos no era confiable? – nokturnal

+1

Utilizamos FileSystemWatcher para supervisar la generación de archivos por otro sistema. Los archivos deben generarse en momentos específicos con nombres predefinidos. En caso de que el archivo no se genere dentro de su intervalo de tiempo, monitor envía alerta. Muchas veces FileSystemWatcher "se perdió" o modificaciones de archivos que dieron lugar a muchas alertas "falsas". Busqué en la web y descubrí que el problema también es común para otros. –

Cuestiones relacionadas