Domanda

Ho un programma che inviare un documento a un driver di stampa PDF e che i driver di stampa su una particolare directory. Dopo la stampa voglio attaccare il pdf in una e-mail (MailMessage) e inviarlo via.

In questo momento, io mando il documento alla stampante (goduto genera un nuovo processo) e quindi chiamare un FileSystemWatcher.WaitForChanged (WaitForChangedResult.Created), ma "la stampa" quando l'oggetto viene creato, non è ancora fatto e la stampante PDF ha ancora un blocco su di esso, gettando un errore quando provo ad allegare il file ad una e-mail.

  • Ho considerato un Thread.Sleep pianura (2000) o qualsiasi altra cosa, ma questo è di gran lunga meno di ideale.
  • Ho considerato mettendo il codice allegato in un blocco try / catch e loop in caso di fallimento, ma ancora una volta, questo è solo una cattiva notizia.

Non posso davvero pensare a una soluzione elegante.

È stato utile?

Soluzione

WaitForChanges è in attesa per l'evento creato come hai esso codificata. Come viene creato il documento, si ottiene una notifica: questo non significa che il file è completamente scritto e il blocco rimosso.

Purtroppo, non so di una buona soluzione diversa polling periodicamente il file. Se ci fosse un evento di "tutte le serrature rimosse", è possibile utilizzare questo, ma non c'è.

Ho appena controllato la nostra discarica PDF Codice repertorio, e usiamo solo WaitForChanges per rilevare l'inizio di un nuovo file. Abbiamo quindi utilizzare un try {} catch {} dove il fermo (non riuscendo a ottenere diritti sul file) invia nuovamente i tentativo nella coda manteniamo: ogni tentativo di "sfila" più a lungo, in modo che il primo tentativo è di 1 secondo dopo abbiamo rilevato il file, il secondo è di 2 secondi più tardi, poi 4, 8, ecc Questo riduce il numero di tentativi su file di grandi dimensioni, pur essendo abbastanza sensibile ai file più brevi.

Altri suggerimenti

Bene, fino a quando l'osservatore sta guardando il file e ti permette di sapere ogni volta che è cambiato, si può semplicemente ignorare le notifiche di modifica che si verificano durante i file è ancora bloccato (ancora in fase scritta) e attendere la notifica di modifica ultima che segnalerebbe l'ultimo evento di scrittura, dopo di che il file deve essere accessibile (a quel punto si poteva finalmente disabilitare l'orologio).

Oltre a questo io non sono sicuro di quello che si può fare, perché l'osservatore ha "chiuso file" nessun caso AFAIK.

Per quanto ne sappia non v'è alcun modo per verificare la presenza di blocchi di file senza la gestione degli errori.

inizia lo stampante PDF con un nuovo processo forse? Poi si dovrebbe essere in grado di monitorare questo processo e quando è uscito il file verrà sbloccato.

Se si utilizza Adobe Acrobat per questo, è possibile generare il PDF con Acrodist.exe (la parte superiore della mia testa, si desidera che l'opzione / N), e quindi attendere che il processo generato per uscire

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top