Forum: PC-Programmierung Speicherort der Settings unter VB?


von Norbert G. (realist_50)


Lesenswert?

Hallo,

inzwischen habe ich gelernt, wie man unter Visual Basic Einstellungen, 
die man beim nächsten Start eines Programms benötigt, z.B. Größe und 
Lage des Programmfensters auf dem Bildschirm, speichert: Dazu bietet 
Visual Studio 2015 (ich nutze davon ausschließlich Visual Basic) die so 
genannten Settings an und das klappt auch prima.

In älteren Versionen des Programms wurden die zu sichernden Daten in die 
Windows Registry eingetragen. Dort konnte man sie ggf. auch manuell 
editieren und sogar komplett löschen (REGEDIT => 
HKEY_CURRENT_USER\Software).

Bisher dachte ich, bei den jetzt verwendeten Settings handele es sich um 
einen (variablen) Speicherbereich innerhalb des Programmcodes, so dass 
dieser beim Übertragen des fertig compilierten Programms auf einen 
anderen Computer einfach mitgenommen wird. Wie ich aber nun festgestellt 
habe, scheint das nicht der Fall zu sein. Vielmehr benimmt sich der neue 
PC so als kenne er die Einträge gar nicht. Und das Schlimmste: Einmal 
initialisiert, sind die Settings immer da! Man kann sie vielleicht per 
Programm auf Null setzen - aber eben nicht ungeschehen machen. Mangels 
weiterer PCs kann ich keine weiteren Simulationen ohne Settings 
durchführen. Das wäre aber wichtig bevor ich das Programm fürs Update an 
bereits gelieferten Anlagen heraus gebe.

Ich wüsste also gerne, wo die Settings in meinem eigenen Arbeits-PC 
abgelegt sind und wie ich sie komplett löschen kann. Kann mir jemand von 
Euch sagen, wo ich diese Einträge finde?

Viele Grüße

Norbert

von bluppdidupp (Gast)


Lesenswert?

Kenne VB / VB.NET da nicht, aber neben der Registry sind die üblichen 
Speicherpfade (bei aktuellen windows-versionen):
C:\Users\{windowsbenutzername}\AppData\ - für benutzerspezfische 
Einstellungen/Daten
C:\ProgramData\ - für Rechner-globale Programmeinstellungen

Die konkreten Speicherpfade kann man für bestimmte Windows-Versionen 
leicht googlen - siehe auch: 
https://msdn.microsoft.com/de-de/library/windows/desktop/dd378457.aspx
In eigenen Programmen sollte man entsprechend für Settings vorgesehne 
APIs nutzen, niemals die Pfade hardkodieren.
Für bestimmte Zwecke gibt es auch eigene vorgesehene Pfade.
Die konkreten Pfade können auch über SHGetKnownFolderPath() oder 
entsprechende Umgebungsvariablen ermittelt werden.
(In .NET-Anwendungen: Environment.GetFolderPath())

von Der haarige Hubert (Gast)


Lesenswert?

Norbert G. schrieb:

> Mangels weiterer PCs kann ich keine weiteren Simulationen ohne Settings
> durchführen.

VM?

> Ich wüsste also gerne, wo die Settings in meinem eigenen Arbeits-PC
> abgelegt sind

Die Application-Settings befinden sich in der *.exe.config, die 
User-Settings irgendwo in einem tieferen Unterverzeichnis unter 
%AppData%, glaube ich (aber unter einem Hash, der sich von Installation 
zu Installation unterscheiden kann).


> Kann mir jemand von Euch sagen, wo ich diese Einträge finde?

Probiere mal das hier:
1
Dim config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal)
2
MessageBox.Show(config.FilePath)

von Norbert G. (realist_50)


Lesenswert?

Hallo,

danke für Eure spontanen Tipps! Ich habe lange herum probiert, aber es 
hat mir nur wenig geholfen.

In der ellenlangen Liste, die mir Bluppdidupp genannt hatte, wird ein 
typischer Windows-Ordner, der vom Namen her irgendetwas mit den Settings 
zu tun haben könnte, gar nicht erwähnt.

Den Configurationmanager von Hubert kennt der VB-Compiler nicht, auch 
nicht, wenn ich ihn als Member von me oder my.computer angebe.

Die Datei (projektname).exe.config (auch von Hubert) gibt es tatsächlich 
- sie steht im VB-Projektverzeichnuns unter (Projektname)\Bin\Debug - 
also immerhin im Ausgabeverzeichnis, aber dabei handelt es sich offenbar 
dennoch nur um die Entwurfsversion. Denn hier sind nur die Namen der 
Variablen und ggf. deren numerischen Default-Werte eingetragen, nicht 
aber die letzten beim Schließen des Programms tatsächlich entstandenen 
aktuellen Werte (wozu auch ein String gehört, nämlich eine 8stellige 
alphanumerische Seriennummer; dieser String ist in der Datei leer). 
Exakt die gleiche Datei findet sich auch im Projekt-Hauptverzeichnis, 
dort jedoch unter dem Namen app.config.

Eine 10-minütige maschinelle Suche im Verzeichnis C:\Benutzer\Norbert 
nach irgendeiner Datei, die einen der Variablennamen aus den Settings 
enthält, brachte ebenfalls nichts.

Immerhin fand ich schließlich im Hauptverzeichnis der Festplatte einen 
Ordner namens C:\Documents and Settings. Direkt darunter auch eine 
deutsche Version namens C:\Dokumente und Einstellungen. Da könnten die 
Settings drin stecken. Aber dummerweise sind die beiden Verzeichnisse 
gegen meinen Zugriff geschützt und ich fand auch in der "erweiterten 
Freigabe" keinerlei Möglichkeit, das zu ändern.

Mir bleibt also nur die Möglichkeit, für den Fall, dass die neu auf 
anderen Computern installierten Programm-Kopien keine Settings finden, 
passende Defaultwerte vorzusehen und dabei zu hoffen, dass schon alles 
gut gehen wird...

Viele Grüße

Norbert

von Der haarige Hubert (Gast)


Angehängte Dateien:

Lesenswert?

Norbert G. schrieb:
> Den Configurationmanager von Hubert kennt der VB-Compiler nicht, auch
> nicht, wenn ich ihn als Member von me oder my.computer angebe.

Hmm ... müsste eigentlich vorhanden sein; diese Klasse gibt es schon 
seit .NET 2.0:

https://msdn.microsoft.com/de-de/library/system.configuration.configurationmanager(v=vs.110).aspx

Hast du System.Configuration bei den Referenzen in dein Projekt 
eingebunden? Ich sehe gerade, dass das entgegen meiner Annahme nicht 
automatisch bei der Projekterstellung passiert (zumindest nicht bei 
allen .NET-Projekttypen).

Zusätzlich noch
1
Imports System.Configuration

oben in die Quelldatei setzen, in der du ConfigurationManager benutzt 
(ohne Gewähr; ich habe noch nie VB verwendet, nur ab und zu C#).

von Der haarige Hubert (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es mal ausprobiert: Die Datei (user.config) befindet sich im 
angezeigten Ordner, sobald die Settings gespeichert wurden.
1
<?xml version="1.0" encoding="utf-8"?>
2
<configuration>
3
    <userSettings>
4
        <WindowsApp1.My.MySettings>
5
            <setting name="Test" serializeAs="String">
6
                <value>Tralala</value>
7
            </setting>
8
        </WindowsApp1.My.MySettings>
9
    </userSettings>
10
</configuration>

von Norbert G. (realist_50)


Lesenswert?

Hallo Hubert,

vielen Dank für Deine Ergänzung! Ich habe das sofort versucht, bin aber 
nicht weiter gekommen.

Beim Eintragen der Imports-Anweisung wird der Name 
"System.Configuration" nur hellgrau dargestellt und die mit dem Cursor 
verbundene Sprechblase sagt "Imports Statement is unnecessary". Offenbar 
ist es bereits stillschweigend vorhanden. Dementsprechend ändert sich 
auch nichts bei der Eingabe der Dim-Anweisung (die ich gleich als eine 
der ersten in der Sub Form1_Load angegeben hatte); der Compiler kennt 
die Variable "ConfigurationManager" nicht.

Ich gebs jetzt auf; sollen die Settings meinetwegen bleiben wo sie sind 
- trotzdem danke für Deine Geduld!

Viele Grüße

Norbert

von Norbert G. (realist_50)


Lesenswert?

Hallo Hubert,

unsere Mails haben sich gekreuzt. Dank Deines erneuten Tipps habe ich 
jetzt doch eine heiße Spur gefunden! Es handelt sich zwar noch nicht um 
die Settings aus der aktuellen Version meines Programms, aber immerhin 
bin ich auf 3 "Leichen" aus meinen ersten Gehversuchen mit diesen 
Settings gestoßen. Das Verzeichnis lautet ganz ähnlich wie bei Dir, 
nämlich

C:\Users\Norbert\AppData\Local\WindowsApplication3\WA3_USB_mit_FT232_Ver 
weis_Url_fsr0fa53z1d0qhbdehmij005yrjlkw0g\1.0.0.0

Und genau da drin findet sich eine Datei namens user.config.

Jetzt muss ich nur noch heraus finden, wo unter den zahllosen Einträgen 
unter ...\AppData\Local mein aktuelles Programm die Settings speichert 
(ich hatte irgendwann und irgendwo die Bezeichnung "Windows 
Application3" geändert...) - diese Aufgabe sollte lösbar sein!

Danke!

Norbert

von Norbert G. (realist_50)


Lesenswert?

@Hubert:

Datei gefunden! Hier steht sie:

C:\Users\Norbert\AppData\Local\Microsoft\T53S_V115.vshost.exe_Url_w5s0dm 
xkkmxy2r24vaxzmgvk55ezjgwm\1.0.0.0

Entscheidend war Dein Hinweis, dass die Datei mit den Settings einfach 
nur "user.config" heißt. Nur mit dieser Information war in dem irren 
Wust von Dateien (ich glaube, das sind bei mir mehrere Tausend) 
wenigstens eine maschinelle Suche möglich.

Nochmal Danke!

Norbert

von Der haarige Hubert (Gast)


Lesenswert?

Schön, dass es doch noch geklappt hat!

> C:\Users\Norbert\AppData\Local\Microsoft\T53S_V115.vshost.exe_Url_w5s0dm
> xkkmxy2r24vaxzmgvk55ezjgwm\1.0.0.0

Ja, das ist bei verschiedenen Windows-Versionen unterschiedlich. Bei mir 
stehen z.B. unter
C:\Users\<Name>\AppData\Local\Microsoft\
nur Daten von Microsoft-Software (VS, Office etc.) und die eigenen 
direkt in
C:\Users\<Name>\AppData\<Programmname>\

Das Problem mit dem von mir geposteten Code ist vermutlich aufgetreten, 
weil du den ersten Schritt (das Hinzufügen von System.Configuration zu 
den Referenzen) ausgelassen hast.

BTW: Wenn man öfter so etwas macht, ist eine virtuelle Maschine ganz 
nützlich; die kann man einfach vor einem neuen Test zurücksetzen, ohne 
darüber nachdenken zu müssen, was an der Konfiguration geändert wurde 
oder welche Runtimes auf dem Entwicklungsrechner vorhanden sind, auf 
anderen aber vielleicht nicht (mal ganz abgesehen von verschiedenen 
Versionen des Betriebssystems).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.