C# Speicherpfad bei Programmstart ermitteln

@roker:
Deine Aussagen sind mehr als pauschal.Ohne schlagfertige ARgumente und Gegeüberstellungen glaub ich das erstmal nicht. Noch ein Hinweis: String.Concat arbeitet auch mit einem StringBuilder ;)
 
@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.
 
Zuletzt bearbeitet: (Edit ergänzt, hoffe das es nun nicht totaler Bullshit ist was ich schrieb)
@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? :D
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
 
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....
 
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
var trace = new System.Diagnostics.StackTrace();
Console.WriteLine("Stacktrace:\n\n" + trace);
erweitert.

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
 
Hi, du kommst wie folgt an den StackTrace:

Code:
try
{
    // dein Code
}
catch (Exception ex)
{
    MessageBox.Show(ex.StackTrace)
}

...alternativ zur MessageBox kannst du es auch in eine Textdatei schreiben lassen.
 
oder du rufst einfach die ToString() Methode der Exception auf. Da wird dann so ziemlich alles drin stehen. StackTrace, Fehlermeldung etc.

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... ;)
 
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
 
Mach mit dem Debugger, dann wirst du während der Exception angehalten (nur wenn du kein Try Catch einbaust), und da kannst du den Stacktrace kopieren.
 
@ roker002: Danke für den Hinweis!

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 :freak:

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

Directory.GetCurrentDirectory() + "tasklist.xml"
geändert. Nun tritt kein Problem mehr auf :)

Nochmals ein großes Dankeschön, ihr habt mir sehr geholfen!
 

Anhänge

hallo das problem hast du ja nun geloest, noch ein tipp von mir.

verwende die statische Methode Path.Combine("","") um pfade zusammenzubauen.

Erspart einiges an arbeit

lg

oli
 
tja was der Debugger alles schaffen kann :D

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 ;)
 
@ WingX: Hab es grade mal ausprobiert, funktioniert auch einwandfrei :)

Gibt es da irgendwelche Vorteile gegenüber Directory.GetCurrentDirectory() ?
 
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
 
Zurück
Oben