Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C# Speicherpfad bei Programmstart ermitteln
- Ersteller Chillosoph
- Erstellt am
@roker: Beim String.Concat gehts nochmal einen Schritt weiter, da werden die einzelnen Objekte auch schön als Array auf den Stack geschmissen und dann mit ToString() im Concat "vorbereitet", sodaß auch ein String am Ende wieder rauskommt. Was bei StringBuilder bei reinen Strings als Eingabe zum concatieren nicht notwendig ist. Der StringBuilder ist in meinen Augen der "schnellere" von beiden, zudem auch der nativere, da String.Concat nur eine übergeordnete Vereinfachung ist, die wie toeffi bereits schrieb, intern selbst den StringBuilder verwendet.
Aber korrigiert mich bitte, wenn dem nicht so ist...
------------------------------
EDIT: Muss mich doch selbst korrigieren. String.Concat verwendet im .Net 2.0 nicht den StringBuilder sondern eine wstrcopy Methode die auch vom StringBuilder verwendet wird. Jedoch sehe ich bei String.Concat zusätzlichen Overhead bei der Ermittlung der resultierenden String Größe durch diverse Schleifendurchläufe über das zu concatierende Array. Das ist bei StringBuilder nicht der Fall.
------------------------------
Nochmal zurück zum Thema Speicherpfad:
Mit AppDomain.CurrentDomain.BaseDirectory erhält man den Speicherpfad der Assembly.
Zum Bilden des Pfades würde ich auch System.IO.Path.Combine verwenden, da sonst Linux/Mono Umgebungen nichts mit dem (vielleicht sogar hartkodierten) Backslash anfangen können und somit das Programm nicht lauffähig wäre.
Auch mehrfach genannt, würde die möglichst vollständige Ausgabe der SecurityException hier helfen das Problem näher eingrenzen zu können.
Vielleicht schonmal gefragt, aber doch immer wieder ein Klassiker wäre auch, ob du unter deinem Windows-Account Schreibrechte auf der Datei hast. Es reicht nicht nur Administrator zu sein, da Administratoren nur ein Recht haben und zwar das sie sich und anderen Accounts jedes Recht zuweisen können. Das muss aber im Falle der Datei nicht bedeuten, das man schon das Schreibrecht auf die Datei hat. Einfacher Test wäre, ob du unter deinem Account mit Notepad in die Datei etwas schreiben und vorallem speichern kannst.
Aber korrigiert mich bitte, wenn dem nicht so ist...
------------------------------
EDIT: Muss mich doch selbst korrigieren. String.Concat verwendet im .Net 2.0 nicht den StringBuilder sondern eine wstrcopy Methode die auch vom StringBuilder verwendet wird. Jedoch sehe ich bei String.Concat zusätzlichen Overhead bei der Ermittlung der resultierenden String Größe durch diverse Schleifendurchläufe über das zu concatierende Array. Das ist bei StringBuilder nicht der Fall.
------------------------------
Nochmal zurück zum Thema Speicherpfad:
Mit AppDomain.CurrentDomain.BaseDirectory erhält man den Speicherpfad der Assembly.
Zum Bilden des Pfades würde ich auch System.IO.Path.Combine verwenden, da sonst Linux/Mono Umgebungen nichts mit dem (vielleicht sogar hartkodierten) Backslash anfangen können und somit das Programm nicht lauffähig wäre.
Auch mehrfach genannt, würde die möglichst vollständige Ausgabe der SecurityException hier helfen das Problem näher eingrenzen zu können.
Vielleicht schonmal gefragt, aber doch immer wieder ein Klassiker wäre auch, ob du unter deinem Windows-Account Schreibrechte auf der Datei hast. Es reicht nicht nur Administrator zu sein, da Administratoren nur ein Recht haben und zwar das sie sich und anderen Accounts jedes Recht zuweisen können. Das muss aber im Falle der Datei nicht bedeuten, das man schon das Schreibrecht auf die Datei hat. Einfacher Test wäre, ob du unter deinem Account mit Notepad in die Datei etwas schreiben und vorallem speichern kannst.
Zuletzt bearbeitet:
(Edit ergänzt, hoffe das es nun nicht totaler Bullshit ist was ich schrieb)
roker002
Commander
- Registriert
- Dez. 2007
- Beiträge
- 2.102
@Rossi
Gute Idee mit dem Notepad.
@StringBuilder
ich werde mir merken... auf jeden Fall bei den größeren Datenmengen, da sehe ich in einem Code, dass der VS selbst beim Editieren der Datei nicht so ganz mitkommen kann und ab und zu mal abstürzt (dies ist auf meinem Code bezogen, wo hierzu keinen Beispiel gibt).
Tja heute auch schon was dazu gelernt.
@Topic
Meint ihr, dass wir irgend wann mal den typen noch mal sehen?
Kenne viele, die ein Problem gelöst haben und dann nicht mehr zurück posten, weil die es nicht für nötig hielten.
Gute Idee mit dem Notepad.
@StringBuilder
ich werde mir merken... auf jeden Fall bei den größeren Datenmengen, da sehe ich in einem Code, dass der VS selbst beim Editieren der Datei nicht so ganz mitkommen kann und ab und zu mal abstürzt (dies ist auf meinem Code bezogen, wo hierzu keinen Beispiel gibt).
Tja heute auch schon was dazu gelernt.
@Topic
Meint ihr, dass wir irgend wann mal den typen noch mal sehen?
Kenne viele, die ein Problem gelöst haben und dann nicht mehr zurück posten, weil die es nicht für nötig hielten.
@roker: mich beschleicht zwar mittlerweile auch dieses Gefühl das der TE sich nicht mehr melden wird. Vermute das er das Problem gelöst hat oder nicht mehr reproduzieren kann. Aber wie dem auch sei.
Zum Thema nochmal: Kann auch sein das an den Sicherheitseinstellungen vom .Net Framework geschraubt wurde und somit das lokal installierte Programm nicht mehr unter FullTrust läuft. In den IO Klassen wird ständig geprüft ob die Assembly ausreichend Rechte hat um dies oder jenes tun zu dürfen. Wenn dem nicht so ist, kommt halt eine SecurityException.
Ansonsten viel Erfolg und alles Gute
Rossibaer
Zum Thema nochmal: Kann auch sein das an den Sicherheitseinstellungen vom .Net Framework geschraubt wurde und somit das lokal installierte Programm nicht mehr unter FullTrust läuft. In den IO Klassen wird ständig geprüft ob die Assembly ausreichend Rechte hat um dies oder jenes tun zu dürfen. Wenn dem nicht so ist, kommt halt eine SecurityException.
Ansonsten viel Erfolg und alles Gute
Rossibaer
roker002
Commander
- Registriert
- Dez. 2007
- Beiträge
- 2.102
hey das kann sein... aber es taucht kein Fenster auf, sogar wenn ich kein FullTrust mache. Hmm kann sein, dass der 2 Verschiedene Accounts hat und in den Sicherheitsbereich von den anderen Account versucht zu schreiben/lesen. Besonders dann wenn man keine Adminrechte hat.
Ich versuche Vorsichtshalber immer auf FullTrust zu stellen, via Attribute. Ich hatte sowas ähnliches wie TE, ich weiss noch damals mit C++ MFC. Da muss man explizit im Manifest angeben....
Ich versuche Vorsichtshalber immer auf FullTrust zu stellen, via Attribute. Ich hatte sowas ähnliches wie TE, ich weiss noch damals mit C++ MFC. Da muss man explizit im Manifest angeben....
- Registriert
- Juli 2010
- Beiträge
- 139
Ui, hier gehts ja rund ^^
Wie kommt ihr darauf, dass ich mich nicht mehr melden würde?
War übers Wochenende bei meinen Eltern, da isses mau mit Internet. Entschuldigt bitte, dass ich nicht bescheid gesagt hab. Ich finde es selber asozial wenn man andere Leute bittet bei einem Problem zu helfen und sich nicht mehr zu melden sobald man die Lösung gefunden hat -.-
Zum Thema:
Die Idee mit dem Notepad scheitert daran, dass das Programm die Datei erst beim ersten Speichern anlegen soll. Das scheitert aber wie berichtet an der SecurityException. Ich habe mal versucht ein leeres Textdokument anzulegen und einfach in Tasklist.xml umzubenennen, hat aber auch keine Besserung gebracht ^^
Wie kann ich mir ein Stacktrace anzeigen lassen?
Ich habe die catch...try Klausel der SecurityException jetzt um
Leider wird kein Consolenfenster mit dem Stacktrace angezeigt!? Tappe ich hier im Dunkeln? Oder gibt es unter VS 2010 eine enspanntere Methode um sich den Stacktrace anzeigen zu lassen?
Vielen Dank für eure Geduld,
Chillosoph
Wie kommt ihr darauf, dass ich mich nicht mehr melden würde?
War übers Wochenende bei meinen Eltern, da isses mau mit Internet. Entschuldigt bitte, dass ich nicht bescheid gesagt hab. Ich finde es selber asozial wenn man andere Leute bittet bei einem Problem zu helfen und sich nicht mehr zu melden sobald man die Lösung gefunden hat -.-
Zum Thema:
Die Idee mit dem Notepad scheitert daran, dass das Programm die Datei erst beim ersten Speichern anlegen soll. Das scheitert aber wie berichtet an der SecurityException. Ich habe mal versucht ein leeres Textdokument anzulegen und einfach in Tasklist.xml umzubenennen, hat aber auch keine Besserung gebracht ^^
Wie kann ich mir ein Stacktrace anzeigen lassen?
Ich habe die catch...try Klausel der SecurityException jetzt um
erweitert.var trace = new System.Diagnostics.StackTrace();
Console.WriteLine("Stacktrace:\n\n" + trace);
Leider wird kein Consolenfenster mit dem Stacktrace angezeigt!? Tappe ich hier im Dunkeln? Oder gibt es unter VS 2010 eine enspanntere Methode um sich den Stacktrace anzeigen zu lassen?
Vielen Dank für eure Geduld,
Chillosoph
oder du rufst einfach die ToString() Methode der Exception auf. Da wird dann so ziemlich alles drin stehen. StackTrace, Fehlermeldung etc.
Mit WriteAllText bekommst du es dann in eine Textdatei geschrieben. So würde ich es machen, da der StackTrace mit unter recht lang werden kann und dann die MessageBox riesig wird und nicht mehr so richtig weggeklickt werden kann.
Und allgemein, mach dich locker, das waren nur Spekulationen über dein Verbleib. Wir haben dich halt vermisst...
Code:
try
{
// dein Code
}
catch (Exception ex)
{
System.IO.File.WriteAllText("C:\\TEMP\\Exception.txt", exception.ToString());
}
Mit WriteAllText bekommst du es dann in eine Textdatei geschrieben. So würde ich es machen, da der StackTrace mit unter recht lang werden kann und dann die MessageBox riesig wird und nicht mehr so richtig weggeklickt werden kann.
Und allgemein, mach dich locker, das waren nur Spekulationen über dein Verbleib. Wir haben dich halt vermisst...
- Registriert
- Juli 2010
- Beiträge
- 139
Danke für die Tipps!
Leider war keiner der beiden erfolgreich
Es taucht keine MessageBox auf, und eine Datei wird auch nicht angelegt.
Kann nur eine MessageBox gleichzeitig angezeigt werden? Würde wenig Sinn machen, oder?
Dass keine .txt Datei angelegt wird, könnte ja eventuell an dem selben Securityproblem liegen...
Ich werde das Programm mal unter Win XP laufen lassen und die Ergebnisse posten...
So long,
Chillosoph
Leider war keiner der beiden erfolgreich
Es taucht keine MessageBox auf, und eine Datei wird auch nicht angelegt.
Kann nur eine MessageBox gleichzeitig angezeigt werden? Würde wenig Sinn machen, oder?
Dass keine .txt Datei angelegt wird, könnte ja eventuell an dem selben Securityproblem liegen...
Ich werde das Programm mal unter Win XP laufen lassen und die Ergebnisse posten...
So long,
Chillosoph
- Registriert
- Juli 2010
- Beiträge
- 139
@ roker002: Danke für den Hinweis!
Anbei der Stacktrace.
Die Lösung des Problemes liegt wohl in dem Pfad begraben:
Das ist ja kein sinnvoller Pfad
Entschuldigt bitte, dass ihr den Stacktrace erst jetzt bekommt. Das Rätselraten bezüglich der Rechte war dann wohl hinfällig.
Ich habe nun noch ein bisschen herumprobiert, und habe die Lösung gefunden:
Das geht eben nicht, weil, wie man in der Stacktrace sehen kann, der Pfad sinnlos wird. Ich habe es nun in

Nochmals ein großes Dankeschön, ihr habt mir sehr geholfen!
Anbei der Stacktrace.
Die Lösung des Problemes liegt wohl in dem Pfad begraben:
.....\Debug\ToDo.EXE\tasklist.xml
Das ist ja kein sinnvoller Pfad
Entschuldigt bitte, dass ihr den Stacktrace erst jetzt bekommt. Das Rätselraten bezüglich der Rechte war dann wohl hinfällig.
Ich habe nun noch ein bisschen herumprobiert, und habe die Lösung gefunden:
eigentlich reicht: Application.ExecutablePath + "\\tasklist.xml"
Das geht eben nicht, weil, wie man in der Stacktrace sehen kann, der Pfad sinnlos wird. Ich habe es nun in
geändert. Nun tritt kein Problem mehr aufDirectory.GetCurrentDirectory() + "tasklist.xml"
Nochmals ein großes Dankeschön, ihr habt mir sehr geholfen!
Anhänge
roker002
Commander
- Registriert
- Dez. 2007
- Beiträge
- 2.102
tja was der Debugger alles schaffen kann 
habs auch gemerkt als ich mal wieder mit PHP arbeiten musste... ohne debugger ist man ab und zu einfach aufgeschmissen.
@chilloshop
für die Zukunft... Wenn irgendwas nicht funktioniert, versucht erst mal zu debuggen. Setze einen Breakpoint in der Zeile wo du vermutest einen Fehler vorzufinden und geh da alles langsam durch! Hilft viel schneller als hier und dort im Forum zu Posten. Und wenn es doch nicht hilft, dann kannst du auch gerne Fragen
habs auch gemerkt als ich mal wieder mit PHP arbeiten musste... ohne debugger ist man ab und zu einfach aufgeschmissen.
@chilloshop
für die Zukunft... Wenn irgendwas nicht funktioniert, versucht erst mal zu debuggen. Setze einen Breakpoint in der Zeile wo du vermutest einen Fehler vorzufinden und geh da alles langsam durch! Hilft viel schneller als hier und dort im Forum zu Posten. Und wenn es doch nicht hilft, dann kannst du auch gerne Fragen
- Registriert
- Juli 2010
- Beiträge
- 139
@ WingX: Hab es grade mal ausprobiert, funktioniert auch einwandfrei 
Gibt es da irgendwelche Vorteile gegenüber Directory.GetCurrentDirectory() ?
Gibt es da irgendwelche Vorteile gegenüber Directory.GetCurrentDirectory() ?
- Registriert
- Juli 2001
- Beiträge
- 2.400
The GetCurrentDirectory function retrieves the current directory for the current process.
Oder zu Deutsch: "Das aktuelle Verzeichnis für den Prozess". Und das ist der Fehler: Das aktuelle Verzeichnis muss eben nicht zwingend das Verzeichnis sein, in dem sich die Exe-Datei der Anwendung befindet. Direkt nach dem Start mag das ja noch stimmen, aber so bald man einmal eine Datei mit einem "Dateiöffnen"-Dialog geöffnet hat oder mit einem "Speichern unter"-Dialog gespeichert hat und dabei das Verzeichnis gewechselt hat, stimmt das schon nicht mehr.Googe: 4sec