Hi,
ich hab schon ziemlich viele möglichkeiten versucht aber nichts hat funktioniert.
Ich habe eine Form mit Logfile funktion usw. Das wird in eine Datei "mylog.txt" gespeichert. Ich habe ein Button und möchte gerne das wie in einem Windows Explorer genau diese Textdatei geöffnet wird.
Aber nicht mit ich öffne die Textdatei und schreibe das zeug in xyz.text rein .... sondern ist es möglich das ding mit notepad zu öffnen damit man sichs dann angucken kann?
Mit Process.Start("datei.txt") kannst du die Datei im eingestellten Standardeditor öffnen.
Wenn du nach dem Schließen noch was mit der Datei machen willst musst du dir eine Instanz von Process erstellen und dann WaitForExit() aufrufen.
Hallo rastalt,
Wenn du nach dem Schließen noch was mit der Datei machen willst musst du dir eine Instanz von Process erstellen und dann WaitForExit() aufrufen.
aber WaitForExit nie im GUI-Thread benutzen. [FAQ] Warum blockiert mein GUI?
herbivore
hierfür musst du dann aber threading und events verwenden.
Das könnte dann in etwa so aussehen:
public class FileOpener
{
public event EventHandler FileClosed;
private Thread openingThread;
private string file;
public FileOpener(string file) {
this.file = file;
}
public void Open() {
this.openingThread = new Thread(new ThreadStart(OpenInThread));
this.openingThread.Start();
}
private void OpenInThread() {
Process p = new Process();
p.StartInfo.FileName = this.file;
p.Start();
p.WaitForExit();
if(FileClosed != null)
FileClosed(this, new EventArgs());
}
}
In diesem Zusammenhang musst du dann noch [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) beachten.
@herbivore: Da hast du natürlich recht. Das hatte ich vergessen zu erwähnen.
@rastalt:
da du das event in einem thread schmeißt und sich vermutlich ein anderer thread an/abmelden kann, solltest du vor dem feuern des events eine referenz auf dessen delegaten holen und mit dieser arbeiten, sonnst kannst du unter umständen eine nicht reproduzierbare und absolut spontan auftretende null-ref-exception bekommen.
Puh, das war ja nen Satz. 😜
Ich nehme an du meinst, dass zwischen der Prüfung auf null und dem Auslösen des Events, jemand das Event deregistrieren könnte und es dann wieder null wäre, oder?
Mir ist jetzt nur nicht klar, wie ich das Problem lösen kann.
/Edit:
EventHandler h = FileClosed;
if(h != null)
h(this, new EventArgs());
Meinst du so?
Wunderbar, da hatte ich ja den selben Einfall. Wäre das auch erledigt. 🙂
Es gibt sogar das Standardsnippet "invoke" dafür.
Ansonsten: :rtfm: Process.Exited-Ereignis
Das kommt mir einfacher vor, als dazu noch eine Klasse zu haben und ist vermutlich unmessbar performanter, da nicht ein zusätzlicher Thread benötigt wird (btw: IsBackground sollte da auf true sein.).
mfg
SeeQuark