Laden...

Gelöschte .Config wiederherstellen bzw. erzeugen

Erstellt von Cornflake vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.114 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren
Gelöschte .Config wiederherstellen bzw. erzeugen

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

16.835 Beiträge seit 2008
vor 9 Jahren

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.

F
10.010 Beiträge seit 2004
vor 9 Jahren

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?

2.079 Beiträge seit 2012
vor 9 Jahren

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.

P
1.090 Beiträge seit 2011
vor 9 Jahren

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:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

S
93 Beiträge seit 2008
vor 9 Jahren

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.

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren

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.

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren

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?

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 9 Jahren

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:

  1. Projektmappe neu erstellen
  2. .config Datei in z.B. den Ressourcen Ordner des Projekts reinkopieren und als eingebettete Ressource markieren.
  3. Folgenden Code einbauen.
    ! Dabei ist zu beachten. Sollte der Pfad zur Datei nicht ganz stimmen ist der Stream **null **ohne weitere Fehlermeldungen. Und ganz wichtig Unterorder sind mit "." getrennt mit anzugeben. Und Groß-/Kleinschreibung beachten.

//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