Seite 2 von 2

Re: GetProgramDataDirectory()

Verfasst: 03.12.2015 10:22
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.

Re: GetProgramDataDirectory()

Verfasst: 03.12.2015 11:54
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

Re: GetProgramDataDirectory()

Verfasst: 28.09.2017 12:48
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)