FileSystemWatcher.WaitForChanged rendimientos, pero todavía hay un bloqueo en el archivo

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

Pregunta

Tengo un programa que envía un documento a un controlador de impresora PDF y que las impresiones del controlador en un directorio en particular. Después de la impresión Quiero adjuntar el PDF a un correo electrónico (MailMessage) y lo envía fuera.

En este momento, puedo enviar el documento a la impresora (wich genera un nuevo proceso) y luego llamar a un FileSystemWatcher.WaitForChanged (WaitForChangedResult.Created) pero cuando se crea el objeto, todavía no se ha hecho "impresión" y la impresora PDF todavía tiene un bloqueo en ella, lanzando un error al intentar adjuntar el archivo a un correo electrónico.

  • he considerado un Thread.Sleep llanura (2000) o lo que sea, pero eso es menos que ideal.
  • consideré poner el código adjunto en un bloque try / catch y en lazo con el fracaso, pero de nuevo, eso es sólo una mala noticia.

Realmente no puedo pensar en una solución elegante.

¿Fue útil?

Solución

WaitForChanges es esperando el evento creado como lo haya codificado. A medida que se crea el documento, recibir una notificación: esto no significa que el archivo está totalmente escrito y la cerradura eliminado.

Lamentablemente, no sé de una buena solución que no sea de votación el archivo periódicamente. Si había un evento de "todos los bloqueos retirados", podría utilizar eso, pero no lo hay.

Lo que nos registramos nuestra volcado a PDF código del directorio, y que sólo uso WaitForChanges para detectar el inicio de un nuevo archivo. A continuación, utilizamos un try {} catch {} donde la captura (de no poder conseguir los derechos sobre el archivo) vuelve a presentar el intento en la cola mantenemos: cada intento "retrocede" durante más tiempo, por lo que el primer intento es de 1 segundo después de que detectamos el archivo, el segundo es de 2 segundos más tarde, luego 4, 8, etc. Esto reduce el número de reintentos de archivos de gran tamaño sin dejar de ser bastante sensible a los archivos más cortos.

Otros consejos

Bueno, siempre y cuando el observador está mirando el archivo y que le permite saber siempre que haya cambiado, puede simplemente ignorar las notificaciones de cambio que se producen mientras los archivos aún se bloquea (o aún se está escribiendo) y esperar a que la notificación de cambio final que sería una señal de la última prueba de escritura, después de lo cual el archivo debe ser accesible (momento en el que finalmente podría desactivar el reloj).

Aparte de eso no estoy seguro de lo que puede hacer, debido a que el observador no tiene "archivo cerrado" evento que yo sepa.

Que yo sepa no hay ninguna manera de comprobar los bloqueos de archivo sin control de errores.

¿Se inicia la impresora pdf con un nuevo proceso tal vez? Entonces usted debe ser capaz de controlar ese proceso y cuando ha salido de su archivo será desbloqueado.

Si utiliza Acrobat de Adobe para esto, se puede generar el PDF con AcroDist.exe (de la parte superior de mi cabeza, desea que el interruptor de encendido / N), y luego esperar a que el proceso generado para salir

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