Ich habe eine kleine Bibliothek geschrieben die Daten zum Cachen in eine Datei schreibt (ist nicht der Hauptzweck sondern nur ein Nebenprodukt). Im Hauptprojekt (ein ASP.NET Projekt) würde ich die Datei mit MapPath in ein bestimmtes Verzeichnis legen.
Da die Library aber unabhängig vom Hauptprojekt sein soll, will ich nicht mit dem Server.MapPath arbeiten - was ja bei normalen Applikation nicht genutzt wird. Zum Entwickeln habe ich einfach einen Unterordner des aktuelle Arbeitsverzeichnisses genutzt.
Meine Frage ist nun wo und wie man diese Daten idealerweise ablegt? Und zwar so, dass sowohl eine normale Anwendung als auch eine Webanwendung damit klar kommt. Wer hat hier eine Empfehlung oder kennt eine best practice?
Da die Daten Benutzerspezifisch sind, sollten sie nicht zentral in c:\temp o.ä. gespeichert werden, wo sie jeder User auslesen kann oder sich mehrere Instanzen der Anwendung in die Quere kommen.
Die Variable ist auch Benutzerspezifisch, da im Normalfall auf ein Verzeichnis unterhalb des Userprofile-Verzeichnisses zugegriffen wird. Es sei denn es hat jemand dran rum gefummelt ;-)
Ich habe mich für eine Mischvariante entschieden. Damit man das Verzeichnis zur Not noch "verlegen" kann, lässt es sich in der web.config als aus der app.config mit dem gleichen Codeschnipsel auslesen. Als Fallback dient wie bereits erwähnt die Umgebungsvariable.
Ja, das sollte man dazu sagen. Im normalen Arbeitsverzeichnis hat es offensichtlich keinen Schreibzugriff wie ich gerade ausprobiert habe - was wie ich glaube ein Windowsordner ist - das hätte ich eigentlich auch nachgucken können, aber ich muss nun ins Bett :).
...ist möglich, würde ich aber nicht empfehlen. Im Standardfall ist das genau das gleiche wie %TEMP%, wenn allerdings jemand seinen Temp-Path ändert, legt man damit, für den Nutzer nicht änderbar, einen weiteren Temp-Ordner an. Machen das 10 Programme mit evtl abweichenden Namen, hat man 10 verschiedene Temp-Ordner. Da kommt freude auf ;o)
Im IO-Namespace gibt es für das Auffinden des Temporären Verzeichnisses schon eine extra statische Methode die auch noch gleich einen Fallback eingebaut hat wenn es einen Tempordner nicht geben sollte.
string tmp = Path.GetTempPath();
Fallback:
This method checks for the existence of environment variables in the following order and uses the first path found:
The path specified by the TMP environment variable.
The path specified by the TEMP environment variable.
The path specified by the USERPROFILE environment variable.
Genau dafür ist diese Umgebungsvariable da.