AppDirectory Ermitteln!

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

@ts-soft

Damit würdest Du aber das ergebnis verfälchen und das ist ja nicht
sinn der sache. Wenn ich nun anhand vom AppPath eine Externe
Datei nachladen möchte, würde ich somit auf ein falsches (CurrentDir)
verzeichnis verweisen und die Anwendung würde/könnte crashen.
Das mit mit dem C:\Programme\PureBasic\Compilers\ ist zwar blöd,
aber wie bereits hardfalcon schon sagte, völlig korrekt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Irrtum, du findest mit Compilierten Exe den richtigen Pfad, sowie auch mit der PureBasic08915.exe. Der Pfad ist in jedem Fall korrekt. Die "Verfälschung" macht der PBCompiler, was techn. bedingt aber auch notwendig ist.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Angenommen ich hatte zuvor irgendwo im Code mit CurrentDir das
verzeichnis gewechselt (aus was für einen grund auch immer. z.b. wegen
FileRequester oder so) und möchte nun ein externes File nachladen
das sich im selben (ProgrammDir) befindet. Na fällt Dir jetzt was auf ? :wink:

Ok, currentdir wird bei Deiner methode zwar nur bei /Compilers angewandt,
aber es könnte für das MainProgram fatal sein.

BTW:

Mit jaPBe greift die methode auch nicht.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Nein, weil CurrentDir von dem PBCompiler gesetzt wird, mit SetCurrentDirectory_(@Dir). Da kommt niemand mehr zwischen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Ein kleines beispiel:

Code: Alles auswählen

dir$="C:\Windows\"
SetCurrentDirectory_(@dir$)
a$=Space(#MAX_PATH)
x=GetCurrentDirectory_(#MAX_PATH,@a$)

Debug a$
Und wenn ich nun ein File aus dem selben (App)Dir laden möchte und
dieses (was ja niemals ausgeschlossen werden kann) mit /Compilers
endet, haben wir ein problem. :mrgreen:
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

ts-soft hat geschrieben:Hier mal meine Version, aus meiner Bausteinsammlung. Unterschied ist folgender: Es wird auch in der IDE der richtige Pfad ermittelt, wichtig für INI-Dateien usw.
...
Also beim Compilieren in der IDE wird einfach geschummelt, da die IDE autom. CurrentDirectory setzt. :wink:
Ja, das ist es was ich gut brauchen kann. Klasse! :allright:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Eine weitere Möglichkeit, den Start aus der Entwicklungsumgebung zu erkennen, besteht darin zu testen, ob der mit GetModuleFileName_() ermittelte Dateiname mit "PureBasic" beginnt:

Code: Alles auswählen

HomeDirPath.S = Space(256)

If GetModuleFileName_(0, @HomeDirPath, Len(HomeDirPath)) = #False
  MessageRequester("Fehler", "Ermittlung des Applikationsverzeichnisses mit GetModuleFileName_() fehlgeschlagen!")
Else
  If UCase(Left(GetFilePart(HomeDirPath), 9)) = "PUREBASIC"
    HomeDirPath = Space(256)

    If GetCurrentDirectory_(Len(HomeDirPath), @HomeDirPath) = #False
      MessageRequester("Fehler", "Ermittlung des Applikationsverzeichnisses mit GetCurrentDirectory_() fehlgeschlagen!")
      End
    EndIf
  Else
    HomeDirPath = GetPathPart(HomeDirPath)
    HomeDirPath = Left(HomeDirPath, Len(HomeDirPath) - 1)
  EndIf

  MessageRequester("Info", "Applikationsverzeichnis: " + HomeDirPath)
EndIf
Kopiert man dieses Programm in den IDE-Editor und startet es, erscheint als Applikationspfad "C:\Programme\PureBasic" (bzw. der Installationspfad von PureBASIC). Speichert man das Programm in der IDE in einem beliebigen Verzeichnis ab, erscheint nach dem Start genau dieser Pfadname. Kompiliert man dieses Programm zu einer Exe-Datei und startet die Exe-Datei (z.B. durch Doppelklick im Explorer), erscheint ebenfalls der Name des Verzeichnisses, in dem die Exe-Datei gespeichert wurde.
Zuletzt geändert von Shardik am 02.09.2005 10:55, insgesamt 1-mal geändert.
MARTIN
Beiträge: 454
Registriert: 08.09.2004 14:03
Wohnort: Kiel

Beitrag von MARTIN »

Ok. Ich mülle euch auch ein bißchen mit Api aufrufen zu und poste das gleiche aber für Linux:

Code: Alles auswählen

DefType.s directory
directory = Space(256) 

;*******************************************
  getcwd_(directory,Len(directory)+1);
;*******************************************
Debug directory

End
Diese Dinge sind leider nicht Plattformübergreifend, deshalb also nur per API möglich.
Die ganzen GUI-Sahen sind auch nur per API möglich dennnoch sind sie auf allen Platformen vorhanden, es hat sich halt bislang noch keiner die Mühe gemacht so was wie GetAppDirectory() zu schreiben, obwohl es eine Kleinigkeit wäre.
Amilo 1667|Suse Linux 10.1_64bit/WinXP |PB 4.00/3.94
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@Martin
Diese Version ist aber einfacher:

Code: Alles auswählen

directory.s = PeekS(get_current_dir_name_())
Debug directory
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten