Seite 1 von 1

Hinzuladen von .ini-Dateien

Verfasst: 19.03.2018 05:52
von Tanaghra
Hallo,

ich habe ein Anwendungsprogramm geschrieben, genauer einen Paßwortgenerator, der bei Programmstart eine zweite Datei laden soll, und zwar eine .ini oder .cfg-Datei (Konfigurationsdatei). Das Problem besteht nun darin, daß das Programm auch auf anderen Rechnern laufen soll, die eine ganze Verzeichnisstruktur haben. In meinem Quellkode kann ich eine Konstante wie

#Qkv_Pg="D:\Programmierung\Basic-Programme\PureBasic\Paßwortgenerator\"

festlegen, die dann auf meinem Rechner läuft, auf dem fremden aber mit ziemlicher Sicherheit nicht.
Nun kann ich natürlich einen Datei-öffnen-Dialog programmieren und den "Fremdnutzer" selbst nach der Datei suchen lassen. Das funktioniert dann aber nur bei diesem einen Mal, denn der Pfad zur cfg-Datei des Fremdnutzers wird ja nach Programmende nirgendwo gespeichert, so daß das ganze Spiel beim zweiten Programmstart von vorne losgeht. Wie löst man am besten dieses Problem?

In diesem Zusammenhang noch eine zweite Frage. Ich habe einerseits ein Quellkodeverzeichnis, das beim Kompilieren/Starten sowohl den Quellkode als auch die .cfg-Datei aus diesem Verzeichnis lädt. Andererseits gibt es aber auch noch die fertige, ausführbare exe-Datei, die sich nicht im Quellkodeverzeichnis, sondern ganz woanders befindet. Die exe-Datei soll ihre cfg-Datei natürlich aus ihrem Verzeichnis und nicht aus dem Quellkodeverzeichnis laden.
Wie kann ich das Programm unterscheiden lassen zwischen a) einer Kompilierung für das Debuggen und b) der Erstellung der fertigen .exe-Datei? Im Fall a) soll die cfg-Datei aus dem Quellkodeverzeichnis geladen werden, im Fall b) aus dem Verzeichnis der .exe-Datei.

Vielen Dank

Re: Hinzuladen von .ini-Dateien

Verfasst: 19.03.2018 07:55
von Jan125

Code: Alles auswählen

CompilerIf #PB_Compiler_Debugger = 1
#Qkv_Pg = {PfadZurDebuggingDotINI}
CompilerElse
#Qkv_Pg = {PfadZurNormalenDotCFG}
CompilerEndIf
Alternativ kannst du auch einen relativen Pfad setzen, z.B. ".\blah.cfg" oder "..\blah.cfg".

Auch den Ordner, wo die .EXE beim Testen ausgeführt wird kannst du verändern.
(Compileroptionen, dann zweiter Reiter... Glaube ich.)


Zur Abspeicherung:
Kannst den Pfad von OpenFileRequester() in ein File im .EXE- Ordner abspeichern und es dann später auslesen.

Re: Hinzuladen von .ini-Dateien

Verfasst: 19.03.2018 09:40
von ts-soft
Zur ersten Frage: Ini-Dateien gehören ins "APPDATA" verzeichnis unter Windows, bzw. in HomeVerzeichnis unter Linux, mit nachfolgendem Beispiel Code kannst Du dieses Verzeichnis ermitteln:

Code: Alles auswählen

Procedure.s GetPrefsFile(AppName.s, FileName.s = "settings.prefs", Publisher.s = "ts-soft")
  Protected Path.s, slash.s
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      slash = "\"
      Path = GetEnvironmentVariable("APPDATA") + "\"
    CompilerDefault
      slash = "/"
      Path = GetHomeDirectory() + "."    
  CompilerEndSelect
  If Publisher
    Path + Publisher + slash
    If Not FileSize(Path) = - 2
      CreateDirectory(Path)
    EndIf
  EndIf
  Path + AppName + slash
  If Not FileSize(Path) = - 2
    CreateDirectory(Path)
  EndIf
  If FileSize(Path) = -2
    ProcedureReturn Path + FileName
  EndIf
EndProcedure

Debug GetPrefsFile("Passwortdingens.exe", "meineIni.ini", "Tanaghra")
Zur zweiten Frage:
Am besten in den Einstellungen:
Datei / Einstellungen / Compiler / Standard den Haken bei
- Temporäres Executable im Quellcode-Verzeichnis erstellen
(welches selbstverständlich Beschreibbar sein sollte)

Gruß
Thomas

Re: Hinzuladen von .ini-Dateien

Verfasst: 19.03.2018 13:49
von Bisonte
@TS-Soft: Mittlerweile muss man nicht mehr den Pfad aus den EnvVars lesen....
PB ist gewachsen, und das sogar auf allen OS ;)

Code: Alles auswählen

Debug GetUserDirectory(#PB_Directory_ProgramData)

Re: Hinzuladen von .ini-Dateien

Verfasst: 19.03.2018 14:15
von ts-soft
@Bisonte
Danke für den Hinweis :allright:

Ich hatte den Code, bis auf die Debugzeile, sowieso in meinem Baukasten, war also keine Arbeit.

Re: Hinzuladen von .ini-Dateien

Verfasst: 20.03.2018 09:00
von Tanaghra
Hallo,

danke für Eure Antworten. Ich hab 10 Minuten später dann in der Hilfe #PB_Compiler_Debugger entdeckt, der mein (zweites) Problem löst:

Code: Alles auswählen

Define.s ZpfV, PfV="Paßwortgenerator.cfg" ; (Ziel)pfad für Voreinstellungen
If #PB_Compiler_Debugger
  ZpfV=#Qkv+PfV
Else
  ZpfV=GetPathPart(ProgramFilename())+PfV
EndIf
Das ist so ziemlich dasselbe, wie Jan125’s Vorschlag, aber die Ausführungen zu CompilerIf in der Hilfe habe ich nicht wirklich verstanden (was da der Unterschied zu einem 'normalen' If sein soll).

Re: Hinzuladen von .ini-Dateien

Verfasst: 20.03.2018 13:21
von ts-soft
aber die Ausführungen zu CompilerIf in der Hilfe habe ich nicht wirklich verstanden
Ein CompilerIf wird nur einmal ausgewertet, nämlich beim Compilieren. Es sind also CompilerDirektiven, wobei nur der zutreffende Teil Code erzeugt.

PS: Meine Lösung des zweiten Problems finde ich aber eleganter :D
Es ist auch nur noch dieser Teil, egal ob gedebuggt oder nicht, erforderlich:

Code: Alles auswählen

ZpfV=GetPathPart(ProgramFilename())+PfV
weil das funktioniert dann immer gleich.

PS2: Es ist seit Jahren nicht mehr üblich Einstellungen im Programmverzeichnis zu erstellen. Diese werden unter Windows meist im verstecktem Verzeichnis "APPDATA" bzw. "Anwendungsdaten" erstellt und sind nur dort , ohne Adminrechte, zu beschreiben. Du bekommst entweder eine Fehlermeldung von Windows oder Deine Einstellungen werden heimlich in "VirtualStore" geschrieben und Dein Programm läuft lediglich im Kompatibilität-Modus.

Das ist nicht Windows-Konform und sollte nur noch bei sehr alten Programmen so vorkommen!

Re: Hinzuladen von .ini-Dateien

Verfasst: 20.03.2018 16:50
von _JON_
ts-soft hat geschrieben:Das ist nicht Windows-Konform und sollte nur noch bei sehr alten Programmen so vorkommen!
Naja, kommt drauf an ob es sich un ein Programm mit Setuproutine oder um ein portables Programm handelt.
Idealerweise macht man es wie z.B. bei Softmaker Office und überlässt es dem Nutzer.

Code: Alles auswählen

Global g_Settingini.s

If FileSize(GetPathPart(ProgramFilename()) + "portable.txt") >= 0
  g_Settingini = GetPathPart(ProgramFilename()) + "setting.ini"
Else
  g_Settingini = GetUserDirectory(#PB_Directory_ProgramData) + "setting.ini"
EndIf

Re: Hinzuladen von .ini-Dateien

Verfasst: 20.03.2018 17:17
von ts-soft
Ich persönlich mag dieses Umgehen der Sicherheitseinstellungen von Windows überhaupt nicht. Portable Programme sollte immer auch Portable genutzt werden, also niemals installiert ins normale System.

Aber mit diesem Problem hat wohl Microsoft zu kämpfen und nicht ich :lol: und es wird einer der Gründe sein, warum der User bald nichts mehr allein bestimmt :freak:

Re: Hinzuladen von .ini-Dateien

Verfasst: 21.03.2018 21:30
von udg
Weil es um Passwort Generator geht. Ich habe letzte Woche einen portablen geschrieben und ist im Netz unterwegs :)

wen es interessiert:
Direkt-Download von meiner Seite

Bild

aus der NFO:

Kurze Rede langer Sinn.

Passwort Generator? Ja, denn warum soll ich mich jedes mal online auf einer
Internetseite anmelden um ein Passwort zu generieren, wenn ich dieses Tool
meinen Bedürfnissen angepasst, bequem auf dem Desktop ausführen kann?

Der Vorteil:

das Passwort muss nicht erst in die Zwischenablage kopiert werden um es dann lokal
zu speichern weil man es dann doch noch irgendwann braucht.

Das kann auch alles mit 2 Klicks erledigt werden.

Der Passwort Generator generiert zufällig aus Millionen von Möglichkeiten starke Passwörter
in einer Länge von 8 - 30 Zeichen

- Sollte nur das Passwort für eine schnelle Anmeldung benötigt werden, reicht es,
die Anzahl der zu generierenden Zeichen einzugeben (Standard wurde auf 20 gesetzt)
und den Button: generiere Passwort klicken.
- danach den Button: Passwort in Zwischenablage kopieren, klicken

das generierte Passwort befindet sich nun in der Zwischenablage und kann überall
sofort eingefügt werden.

- benötigst Du die generierten Angaben für zukünftige Anmeldungen besitzt der
Passwort Generator die Funktion, alle Informationen schnell in eine Text-Datei zu
speichern
- generiere ein Passwort
- gib im ersten Eingabefeld eine Verwendung, Hinweis ein
- gib im zweiten Eingabefeld den zukünftigen oder bestehenden Benutzername oder
Account ein

klicke abschließend auf den Button: Passwort Informationen speichern

Alle mit Passwort Generator erstellten Informationen werden nun in eine Text Datei gespeichert.
Du hast so, immer deine Informationen zur Hand und musst nichts weiter tippen, schreiben oder
zwischen kopieren.

nice and easy