Frage


Ich habe eine Anwendung (WinForms), die eine Datei in den temporären Ordner des Benutzers herunterlädt. Dann öffnet sie die Datei für den Benutzer zum Anzeigen von Inhalten. Wenn die Datei geschlossen ist, wird die Datei aus dem Temp -Ordner gelöscht. Die Anwendung funktioniert in Ordnung, wenn ich öffne, sagen wir ein .pdf und ein .doc Das Problem erscheint beim Versuch, einen .doc zu öffnen, wenn ein anderer WinWord -Prozess noch ausgeführt wird (spielt keine Rolle, ob sie von meiner App oder direkt vom Benutzer geöffnet wird). .

Ich verwende den folgenden Code:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

und dieser, um die Temperatur zu klären

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

Es scheint, dass der laufende Vorgang mein eigenes gestoppt wird. Und aufgrund des Stoppens wird die Datei gelöscht, oder er generiert einen Fehler, während er versucht, die Datei zu löschen.
Haben Sie einen Vorschlag, wie kann ich meinen eigenen Prozess öffnen? Die Sache ist, dass ich nicht weiß, welcher Dateityp ich öffnen muss (es könnte alles sein) und ich zähle unter Windows, um die beste Anwendung auszuwählen. Aus meinem Test funktioniert Notepad in Ordnung, aber Winwort und Acrobat schließen meinen Prozess.
Vielen Dank

War es hilfreich?

Lösung

Ich vermute, dass Microsoft Word hier genau dasselbe tut, wie Raymond Chen die Windows -Shell als tun hier:

Ein Kunde wollte Hilfe bei der Überwachung der Lebensdauer eines Explorer -Fensters.

"Wir möchten eine Kopie von Explorer starten, um einen bestimmten Ordner zu öffnen, und dann warten, bis der Benutzer den Ordner schließt, bevor Sie fortfahren. Wir haben versucht, eine Kopie von Explorer mit dem Ordner in der Befehlszeile zu starten und dann ein WaitForsingleObject im Prozessgriff zu machen, aber das Warten wird manchmal sofort abgeschlossen, ohne zu warten. Wie warten wir, bis der Benutzer das Explorer -Fenster schließt?"

Dies ist ein weiterer Fall, bei dem ein Problem auf halbem Weg gelöst und dann Probleme mit der anderen Hälfte hat.

Der Grund dass Wait­For­Single­Object Rückgaben sofort ist, dass Explorer ein einzelnes Instanzprogramm ist (gut, begrenzter Instanz). Wenn Sie ein Explorer -Fenster öffnen, wird die Anfrage an eine laufende Kopie von Explorer und die Kopie des von Ihnen gestarteten Explorers abgegeben. Deshalb deine Wait­For­Single­Object kehrt sofort zurück.

In Ihrem Fall wird bereits ausgeführt. Wenn Sie also eine erstellen zweite Textprozess und weisen Sie es an, Ihr Dokument zu öffnen. Es gibt einfach die Anfrage an die Instanz des bereits ausgeführten Wortes und beendet den zweiten Prozess, den Sie sofort gestartet haben.

Das ist es, was Sie sehen, wenn Sie beschreiben, dass "der Laufprozess mein eigenes stoppt". Weil diese zweite Instanz sofort nach dem Start geschlossen wird, die Exited Die Veranstaltung wird angehoben und Ihr Code sagt ihm, dass er die Datei löschen soll!

Sie beobachten, dass Notepad (im Gegensatz zu Wort und Adobe Acrobat) gut funktioniert. Das liegt daran, dass Notepad eine Anwendung mit mehreren Instanzen darstellt. Sie können so viele Kopien von Notepad öffnen, wie Sie möchten. Es ist egal, ob bereits 1 oder 6 Kopien auf dem Desktop geöffnet sind. Und was noch wichtiger ist, die Shell zu bitten, ein Textdokument in Notepad zu öffnen, öffnet tatsächlich a zweite Kopie der Notizbewerbung, anstatt eine Anfrage an die zu senden Erste Instanz, um ein neues Fenster für den neuen Dokument zu öffnen.

Andere Tipps

Sie sollten den Prozess festlegen. true so was _OpenFileProces.StartInfo.UseShellExecute = true; Vor Beginn des Prozesses und dann sollte es funktionieren, denke ich ...

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