Hallo
In meinem Programm nutze ich eine foo.exe.config in der ich als "Anwendung" und nicht "Benutzer" Einstellungen hinterlege. Wenn ich meine Anwendung kompiliere, entsteht auch diese Konfig Datei.
Nur wenn ich jetzt jemanden die .exe samt .config kopiere und der die .config löscht, habe ich keinen Weg gefunden diese per Code wiederherstellen zu lassen.
Das Properties.Settings.Default.Save() bringt nichts. 😦
Hat jemand von euch da ne Lösung?
Viele Grüße
Cornflake
Die kann man nicht programmatisch neu erzeugen, weil darin auch Programmabhängigkeiten (Referenzen) gepflegt werden. Ich weiß nicht, wie das bei einer App.Config ist aber ohne zB einer Web.Config startet nicht mal die Web-Anwendung, da sie eben ein Pflichtelement ist.
Wenn Du die Anwendung aber korrekt installierst liegt sie unter C:\Program Files, wo ein normaler User keinerlei Schreibrechte hat und damit auch nichts löschen kann.
Er darf sie ganz einfach nicht löschen.
Properties.Settings.Default.Save()
hat nichts mit der ganzen Datei zutun, sondern nur Programm-Einstellungen.
Was Du als Alternative machen kannst ist, dass die die Anwendung so umbaust, dass Du keine Config-Datei brauchst.
Dann musst Du eben auch auf alle die Config-Features verzichten.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Properties.Settings.Default.Save() speichert den User Teil der Settings.
Wenn du die exe.config Datei mit den default Einstellungen ggf wieder herstellen musst, binde sie als resource ein und erstelle sie bei Programstart ( geht eigentlich nur mit Admin rechten ).
Aber wie Abt schon sagte, wer sollte so dumm sein die zu löschen?
Wäre es nicht möglich, eine Kopie der config als Ressource mitzugeben, in der exe?
Zur Laufzeit muss dann geprüft werden, ob die config da ist und wenn nicht, dann wird die Default-Variante in den Ressourcen dort hin gelegt.
An sich sollte das ja möglich sein, aber lässt sich das ohne Weiteres mit der Configuration-Technik von .NET kombinieren und das Integrieren der config auch gleich beim Build machen?
Dann wäre das im Prinzip eine Lösung - ein Umweg, aber auch eine Lösung.
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Mal eine Einfache Frage.
Wie viele Benutzer hast du den die Hingehen und sich die Mühe machen machen die Config-Datei deiner Anwendung zu Löschen.
Wenn es keine sind, wie so solltest du dafür irgendwelchen Quellcode schreiben.
Sollte man mal gelesen haben:
Wenn ein User an Sachen rumfummelt, die ihn nichts angehen, dann muß er auch die Konsequenzen tragen. Am Besten lernt er es, wenn die Reperatur dann Geld kostet.
Hi
Thx für eure Antworten.
Palladin007s Idee finde ich bisher am besten. Einziges Manko sollte sich mal an dem Dateiaufbau etwas ändern, darf man nicht vergessen die Ressource auch anzupassen.
Also das Programm besteht nur aus einer ca. 100 kb großen Datei.
Diese hat sonst keine besonderen Abhängigkeiten und kann im Prinzip auch einfach als einzelne Exe Datei weitergegeben werden.
Ich habe festgestellt, wenn keine .config vorhanden ist, nimmt das Programm die integrierten Defaultwerte. Man kann in der config ein festen Quelldateipfad und Zieldateipfad hinterlegen. Aktuell ist es so, dass wenn jemand keine Ahnung hat, kann ich Ihm mit einem Texteditor angepasst eine Config geben, in der diese Dateipfade hinterlegt sind. Wenn die in dem gleichen Ordner liegt wie die exe, dann wird die Konfig geladen und im Programm muss er sonst nichts weiter machen ausser Go zu klicken, dann wird die hinerlegte Quelldatei umgewandelt und als Zieldatei gespeichert.
Es kann aber auch sein, dass der die sich selber anpassen muss ohne dass ich die ihm schicken kann. Dann wäre es gut, wenn die automatisch sozusagen als Blankodatei vorhanden ist und er nur in einem Texteditor nach telefonischer Anweisung was eintragen muss.
Hi
Laut MSDN habe ich jetzt folgendes versucht:
Zuerst habe ich in VS die Settings.settings Datei unter der Eigenschaft Buildvorgang als Eingebettete Ressource markiert.
Danach folgenden Code zusammengebaut
string strSchemaPath = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Settings.settings";
System.IO.Stream objIOStream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strSchemaPath);
System.IO.StreamReader sr = new System.IO.StreamReader(objIOStream);
System.IO.StreamWriter sw = new System.IO.StreamWriter("Foo.exe.config");
sw.Write(sr.ReadToEnd());
sr.Close();
sw.Close();
objIOStream.Close();
Leider ist die objIOStream Variable null.
Hat jemand eine Idee was da falsch läuft?
Gelöst 😃
Also die Settings.settings Datei ist zwar auch ne XML aber hat einen abweichenden Aufbau, wie die zum Schluss erzeugte .config.
Daher -leider- sollte sich etwas ändern an der settings Datei muss die .config neu importiert werden.
Ansonsten ist der Ablauf wie folgt:
//Ressourcenname= Foo.exe.config
//Im Ordner = Resources
string strSchemaPath = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Resources.Foo.exe.config";
System.IO.Stream objIOStream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strSchemaPath);
System.IO.StreamReader sr = new System.IO.StreamReader(objIOStream);
System.IO.StreamWriter sw = new System.IO.StreamWriter("Foo.exe.config",false ,Encoding.UTF8);
sw.Write(sr.ReadToEnd());
sr.Close();
sw.Close();
objIOStream.Close();
Grüße Cornflake