C# Speicherpfad bei Programmstart ermitteln

Chillosoph

Ensign
Registriert
Juli 2010
Beiträge
139
Hallo zusammen,

ich hätte da mal ein kleines Problem:

Ich habe in C# ein Programm geschrieben, das beim Programmstart das aktuelle Ausführungsverzeichnis ermitteln, eben jenes in eine Variable schreiben und später als Dateispeicherort verwenden soll.

Leider wird beim Versuch des Speicherns eine System.ArgumentNullException: Der Pfad darf nicht NULL sein. ausgegeben. (Fehlerbehandlung habe ich eingebaut).

Nun ist meine Vermutung, dass die Variable beim Programmstart nicht befüllt wird. Nachstehend mal der Code (entschuldigt die Formatierung:


public partial class MainForm : Form
{
string filename;

private void MainForm_Load(object sender, EventArgs e) //Wird beim Programmstart ausgeführt
{
filename = Path.GetDirectoryName(Application.ExecutablePath) + "tasklist.xml"; //Der Dateispeicherort wird ermittelt
LoadTasks();
this.txtName.Focus(); //Das Aufgabennamensfeld fängt den Cursor
}
}


Vielleicht habt ihr ja eine Idee, wie ich diesem Problem beikommen könnte!?
Falls ihr noch weitere Fragen habt, nur zu!

Vielen Dank im voraus,
Chillosoph
 
Zuletzt bearbeitet: (Kommafehler)
Directory.GetCurrentDirectory()

und wenn du schon Dinge verknüpfst verwend bitte Path.Combine(...) .. man weiß ja nie was da so drinnen steht
 
Tiger_UP23 schrieb:
Directory.GetCurrentDirectory()

Das muss man dann aber direkt nach dem Start des Programmes machen und zwischenspeichern.

Ansonsten ändert sich das gerne mal, wenn man zum Beispiel auf andere Dateien vom Programm aus zugreift.
 
Danke erstmal für die Antworten!

Ich denke mittlerweile nichtmehr, dass das Problem primär mit der Anweisung an sich zu tun hat, sondern dass MainForm_Load garnicht ausgeführt wird. Ich habe da spaßeshalber mal noch die Zeile
MessageBox.Show("Hallo", "Hinweis", MessageBoxButtons.OK);
eingefügt. Beim Programmstart bekomme ich die Box aber nicht zu sehen. Wenn ich die Funktion dieser Anweisung richtig verstanden habe, sollte mir doch besagte Box angezeigt werden, oder irre ich?

Ist an
private void MainForm_Load(object sender, EventArgs e)
irgendetwas auszusetzen?

Der Teil vor dem _Load muss doch so heißen, wie ich auch das Hauptfenster meiner Anwendung genannt habe, oder?

Vielen Dank für eure Mühe,
Chillosoph
 
kann ja sein dass du den Event einfach gelöscht hast. Der eventhandler hat ja nur einen Methodenzeiger (delegate), falls dein Event initialisiert wurde, der einfach auf deinen ..._Load(...) zeigt.

Klicke mal rechts auf die Methode und geh dann "alle Verweise finden". wenn der keine Verweise findet, dann hat sich deine Vermuttung bewahrheitet.
 
Versuchs mal mit Application.StartupPath.
Und das Load muss natürlich mit dem entsprechenden Event verknüpft sein.
 
Hallo,

welche Entwicklungsumgebung benutzt du?
Kannst du nicht einfach debuggen, ob die Variable gefüllt wird?

Das mit der Verknüpfung finde ich einen guten Punkt. Man sollte Strings nie mit "+" verknüpfen sondern immer mit dem entsprechenden String-Operator ("&" oder "." oder ...)

Kenne mich mit der C# Syntax nicht 100% aus, aber im Vergleich zu VB fehlt an deiner Load Funktion der Event Handler, wie auch schon festgestellt wurde.

Solltest du Visual Studio benutzen, dann gehe einfach auf das Formular, Wähle rechts bei Eigenschaften die Event Spalte aus und such dir das Load Event raus.
 
wie hast du überhaupt den Event verknüpft? Wenn du VS benutzt, dann mach lieber alle Events über "Visual Editor". Der generiert dann auch dementsprechend den richtigen Code. Solange du statische GUI machst ist es kein Problem. Bei eine Dynamische GUI was während der Laufzeit erzeugt werden soll, ist es ganz anders.
 
@roker002: Das mit dem "Verweise finden" war ein guter Tipp. In der Tat wurde nur die Funktion gefunden, aber kein Verweis der darauf zeigen könnte.

Solltest du Visual Studio benutzen, dann gehe einfach auf das Formular, Wähle rechts bei Eigenschaften die Event Spalte aus und such dir das Load Event raus.
Das habe ich gemacht, und es stellte sich raus, dass lediglich _1 gefehlt hat. Nun wird alles geladen. (Und es wird auch ein zweiter Verweis gefunden).

Allerdings stellt sich nun das nächste Problem: Beim Speichern kommt eine SecurityException :(
Das Kopieren der .exe auf ein anderes Laufwerk hat leider nicht geholfen. Das Ausführen als Administrator auch nicht.

Hat da einer von euch vielleicht noch eine Idee?


BTW: Warum sollte man strings nicht mit "+" verknüpfen?
 
Hallo,

wie genau sieht dein Error Handler Code aus? Normalerweise sollte man ja mit Try ... Catch eine ausführlichere Nachricht bekommen.

Das mit den Strings rührt bei mir von Sprachen her, wo die Typen-Umwandlung nicht explizit erforderlich ist. Und wenn der Computer dann schlauer als der Nutzer sein möchte und 2 Strings bestehend aus Zahlen und verknüpft mit einem + nicht aneinander anhängt sondern addiert.
 
@Krafty:
Deine Aussage zu der String-Verknüpfung war glaube nicht das was der TE wissen wollte.
Warum man strings nicht mit + verknüpft kannst du hier nachlesen:
 
Zuletzt bearbeitet von einem Moderator: (Link entfernt, da er inzwischen auf dubiose Seite führt)
Chillosoph schrieb:
Beim Speichern kommt eine SecurityException.
Das kann viele Ursachen haben. Wär gut wenn du mal die komplette Exception Message postest, dann kann man dir eher weiterhelfen.

Chillosoph schrieb:
BTW: Warum sollte man strings nicht mit "+" verknüpfen?
Du verknüpfst ja keine einfachen Strings, sondern Pfade. Path.Combine() sorgt dafür, dass dann der Pfad der rauskommt auch valid ist (das muss aber nicht heißen, dass der Pfad auch existiert!)

Strings mit + zu verknüpfen ist im Prinzip kein Problem, ist aber wenn man es öfters hintereinander macht (v.a. in Schleifen) unperformant, da jedesmal ein neues String Objekt erstellt wird.
Als abhilfe dafür gibts die StringBuilder Klasse: Verwenden der StringBuilder-Klasse

Edit:
Wieso füllst du deine Variable eigentlich nicht gleich im Konstruktor der MainForm?
 
Zuletzt bearbeitet:
@Chillosoph,
was willst du genau kopieren? deine Datei die du gerade ausführst? Kann ja sein dass es genau darum nicht geht. Hmm und kann sein dass du deine Datei bewegen willst anstatt diese zu kopieren. Da hast du sicher eine Exception.

Ich dachte String Builder wäre ganz BÖSE! Ich mach meist String.Concat()
 
@roker:Hast du Quellen, wo beschrieben wir das StringBuilder BÖSE ist?
Wenn ja, poste sie mal bitte hier, würde mich mal brennend interessieren.
 
Servus.

Ich habe die try - catch Klausel verwendet, um die Exceptions abzufangen:

bool retry = true;
do {
try
{
Task.SaveTasks(tasks, filename);
retry = false;
}
catch (SecurityException)
{
if (MessageBox.Show(saveSecurityException, "Fehler beim Speichern", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Retry)
retry = true;
else
return false;
}
catch (IOException) {
if (MessageBox.Show(saveInvalidOperationException, "Fehler beim Speichern", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Retry)
retry = true;
else
return false;
}
catch (Exception ex) {
if (MessageBox.Show("Die Aufgabenliste konnte aus einem unbekannten Fehler nicht gespeichert werden:\n\n" + ex + "\n\nSoll versucht werden, die Aufgabenliste erneut zu speichern?", "Fehler beim Speichern", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) == DialogResult.Retry)
retry = true;
else
return false;
}
}

Hierbei sind die "saveSecurityException" und "saveInvalidOperationException" strings die den Text der Fehlermeldung enthalten. (Sinnfrei, ich weiß, fands aber so übersichtlicher).

Daher wird beim raisen der Exception auch nur der von mir eingebaute Text angezeigt. Wie komme ich denn da an ein ausführlicheres Protokoll?

Die Links zum StringBuilder waren sehr interessant, danke dafür!

Ihr müsst wissen, dass ich noch ein ziemlicher kackb00n auf dem Gebiet der Programmierung bin. Deshalb peile ich nicht alles sofort. Ich bedanke mich im voraus für eure Nachsicht :)

@ roker002: Ich will garnix kopieren, ich will nur, dass das Programm beim ersten Start die Datei tasklist.xml anlegt und beim Klick auf "Speichern" ergänzt.

BTW: Wie kann man denn die Formatierung beim Kopieren beibehalten?


Vielen Dank für eure Mühe, ist echt Klasse so ein Forum :)
 
Ok das hilft uns leider immernoch nicht weiter.
Was genau steht denn in der SecurityException? Zeig uns doch mal den Stacktrace, sowie die Message selbst.
 
Was steht den in der Property Message der Exception, wenn die Exception geworfen wird?
 
toeffi schrieb:
@roker:Hast du Quellen, wo beschrieben wir das StringBuilder BÖSE ist?
Wenn ja, poste sie mal bitte hier, würde mich mal brennend interessieren.

Der StringBuilder, so hat jemand hier im Forum geschrieben, soll angeblich viel Performance saugen.

was den + Operator angeht, der ist echt langsam wenn die Strings riesig sind. Hatte früher mal viel mit + Operator gemacht und später auf Concat umgestellt. Man gewinnt bis zu 0.8 Sek an der Geschwindigkeit. Vorallem merkst du das bei den älteren PCs die wenig saft haben.

Ja den StackTrace wäre nett. und nichts ausschneiden... ;)
 
Zurück
Oben