GetProgramDataDirectory()

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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: GetProgramDataDirectory()

Beitrag von GPI »

NeoChris hat geschrieben:Windows kommt auch mit / gut klar ;)
Immer und überall und mit allen Programm etc? Das kann sehr schnell zu Fehlern führen, den man anschließend Ewigkeiten sucht. Sowas macht imo halt den Unterschied zwischen einen guten und einen schlechten Programm aus.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
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

Re: GetProgramDataDirectory()

Beitrag von ts-soft »

NeoChris hat geschrieben:Windows kommt auch mit / gut klar ;)
In manchen Situationen, aber nicht in allen!
Einfaches Beispiel aus der Hilfe:

Code: Alles auswählen

InitialPath$ = "C:\"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Path$ = PathRequester("Bitte wählen Sie einen Pfad aus", InitialPath$)
If Path$
  MessageRequester("Information", "Sie haben folgenden Pfad ausgewählt:"+Chr(10)+Path$, 0)
Else
  MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
EndIf

InitialPath$ = "C:/"   ; anfänglichen Pfad für die Anzeige festlegen (kann auch leer sein)
Path$ = PathRequester("Bitte wählen Sie einen Pfad aus", InitialPath$)
If Path$
  MessageRequester("Information", "Sie haben folgenden Pfad ausgewählt:"+Chr(10)+Path$, 0)
Else
  MessageRequester("Information", "Der Requester wurde abgebrochen.", 0) 
EndIf
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
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Re: GetProgramDataDirectory()

Beitrag von uweb »

Code: Alles auswählen

; #Slash-DefaultPath-BinPath-DataPath.pbi
;
; erkennt SystemDefaultProgramDataDirectory; kann aber auch mit portablen Programmen oder Programmen aus der IDE umgehen (nutzt den SourcePath)
; dadurch ist es universell nutzbar- "Use your path here" ist nicht mehr notwendig
; erkennt "\bin" und nutzt gegebenenfalls "..\data" wenn SystemDefaultProgramDataDirectory nicht verfügbar ist
;
EnableExplicit

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    #Slash = "\"
  CompilerDefault
    #Slash = "/"
CompilerEndSelect

Procedure.s GetDefaultDataDirectory()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      ProcedureReturn GetEnvironmentVariable("APPDATA") + #Slash
    CompilerCase #PB_OS_MacOS
      ProcedureReturn GetHomeDirectory() + "Library/Application Support/"
    CompilerCase #PB_OS_Linux
      ProcedureReturn GetHomeDirectory() +"."
  CompilerEndSelect
EndProcedure

Define.s DataPath, DefaultPath=GetDefaultDataDirectory()
Define.s BinPath = DefaultPath+GetFilePart(ProgramFilename(),#PB_FileSystem_NoExtension)
;Define.s BinPath = DefaultPath+"MyDifferentDirectoryName" ; fix, from Preference, ProgramParameter() or whatever

If Bool(Left(GetFilePart(ProgramFilename()), 9) = "PureBasic")
  BinPath = GetPathPart(ProgramFilename())
Else
  If FileSize(BinPath)=-1
    BinPath = GetPathPart(ProgramFilename())
  EndIf
EndIf

If Right(BinPath,4)="bin"+#Slash
  DataPath = Left(BinPath, Len(BinPath)-4)+"data"+#Slash
  CreateDirectory(DataPath)
Else
  DataPath = BinPath
EndIf

Code: Alles auswählen

; for testing
;
EnableExplicit

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    #Slash = "\"
  CompilerDefault
    #Slash = "/"
CompilerEndSelect

Procedure.s GetDefaultDataDirectory()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      ProcedureReturn GetEnvironmentVariable("APPDATA") + #Slash
    CompilerCase #PB_OS_MacOS
      ProcedureReturn GetHomeDirectory() + "Library/Application Support/"
    CompilerCase #PB_OS_Linux
      ProcedureReturn GetHomeDirectory() +"."
  CompilerEndSelect
EndProcedure

Define.s DataPath, DefaultPath=GetDefaultDataDirectory(), Title
Define.s BinPath = DefaultPath+GetFilePart(ProgramFilename(),#PB_FileSystem_NoExtension)
;Define.s BinPath = DefaultPath+"MyDifferentDirectoryName" ; fix, from Preference, ProgramParameter() or whatever

If Bool(Left(GetFilePart(ProgramFilename()), 9) = "PureBasic")
  Title= "from IDE" ; DataPath and BinPath = SourcePath
  BinPath = GetPathPart(ProgramFilename())
Else
  If FileSize(BinPath)=-1
    Title= "portable"
    BinPath = GetPathPart(ProgramFilename())
  Else
    Title="DefaultProgramDataDirectory"
  EndIf
EndIf

If Right(BinPath,4)="bin"+#Slash
  DataPath = Left(BinPath, Len(BinPath)-4)+"data"+#Slash
  CreateDirectory(DataPath)
Else
  DataPath = BinPath
EndIf

MessageRequester(Title, "BinPath :   "+BinPath+Chr(10)+"DataPath : "+DataPath, #PB_MessageRequester_Ok)
Antworten