Frage

Ich habe ein Programm, das ein Dokument an ein PDF-Druckertreiber und dass Treiber druckt zu einem bestimmten Verzeichnis senden. Nach dem Druck möchte ich die pdf an eine E-Mail (Mailmessage) und sendet es befestigen.

Im Moment, ich sende das Dokument an den Drucker (Wich startet einen neuen Prozess) und rufen Sie dann eine FileSystemWatcher.WaitForChanged (WaitForChangedResult.Created), aber wenn das Objekt erstellt wird, ist es noch nicht getan „Drucken“ und der PDF-Drucker hat immer noch eine Sperre auf sie, werfen einen Fehler, wenn ich versuche, die Datei an eine E-Mail anhängen.

  • Ich habe eine einfache Thread.Sleep (2000) oder was auch immer in Betracht gezogen, aber das ist weit weniger als ideal.
  • Ich hielt die Anlage Code in einen try / catch-Block setzen und Schleifen bei einem Fehler, aber wieder, das ist nur eine schlechte Nachricht.

Ich kann nicht wirklich denken Sie an eine elegante Lösung.

War es hilfreich?

Lösung

WaitForChanges ist für das erstellte Ereignis warten , wie Sie es codiert haben. Da das Dokument erstellt wird, erhalten Sie angemeldet: das bedeutet nicht, dass die Datei vollständig geschrieben wird und die Sperre entfernt.

Leider weiß ich nicht von einer guten Lösung anders als Polling regelmäßig die Datei. Wenn es ein „alle Schlösser entfernt“ Ereignis war, konnte man das verwenden, aber es ist nicht.

Ich habe gerade überprüft unser PDF-Dump Code, und wir WaitForChanges nur verwenden, den Beginn einer neuen Datei zu erfassen. Wir verwenden dann einen try {} catch {} in dem der Fang (andernfalls Rechte über die Datei zu erhalten) erneut sendet den Versuch, in die Warteschlange wir halten: Jeder Versuch, „zieht sich“ länger, so dass der erste Versuch ist 1 Sekunde, nachdem wir erkannt die Datei, die zweite nach 2 Sekunden, dann 4, 8, usw. Dies ist die Zahl, während immer noch ziemlich reagiert, auf kürzere Dateien wiederholt auf große Dateien reduziert.

Andere Tipps

Nun, solange die Beobachter die Datei beobachtet und lassen Sie wissen, wann immer es sich verändert hat, kann man einfach die Änderungsbenachrichtigungen ignorieren, die auftreten, während die Dateien noch gesperrt ist (noch geschrieben werden) und für die ultimative Änderungsbenachrichtigung warten die würde das letzte Schreibereignis signalisieren, nach dem die Datei zugänglich sein sollte (bei dem man schließlich darauf, die Uhr deaktivieren könnte).

Anders als das ich bin nicht sicher, was Sie tun können, weil der Beobachter hat kein Ereignis AFAIK „Datei geschlossen“.

AFAIK gibt es keine Möglichkeit für Dateisperren ohne Fehlerbehandlung zu überprüfen.

Hat der pdf-Drucker mit einem neuen Prozess startet vielleicht? Dann sollten Sie in der Lage sein, diesen Prozess zu überwachen und, wenn es die Dateien freigeschaltet werden verlassen hat.

Wenn Sie mit Adobe Acrobat für diese, können Sie die PDF-Datei mit AcroDist.exe generieren (aus der Spitze von meinem Kopf, können Sie die Option / N mögen), und dann warten, bis der erzeugte Prozess

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top