Laden...

Textdatei "richtig" öffnen

Erstellt von illostos vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.318 Views
I
illostos Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren
Textdatei "richtig" öffnen

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?

Gelöschter Account
vor 14 Jahren

mit der process klasse kannst du notepad starten und die datei gleich als startargument übergeben. dann wird automatisch diese datei in notepad angezeigt.

R
234 Beiträge seit 2007
vor 14 Jahren

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.

Gelöschter Account
vor 14 Jahren

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.

hierfür musst du dann aber threading und events verwenden.

49.485 Beiträge seit 2005
vor 14 Jahren

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

R
234 Beiträge seit 2007
vor 14 Jahren

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.

Gelöschter Account
vor 14 Jahren

@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.

R
234 Beiträge seit 2007
vor 14 Jahren

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?

Gelöschter Account
vor 14 Jahren

EventHandler temp = FileClosed;
if(temp != null)
            temp(this, new EventArgs());

R
234 Beiträge seit 2007
vor 14 Jahren

Wunderbar, da hatte ich ja den selben Einfall. Wäre das auch erledigt. 🙂

946 Beiträge seit 2008
vor 14 Jahren

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