Verschiedene Systempfade für Win&Mac - aber wie für Linux

Für allgemeine Fragen zur Programmierung mit PureBasic.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Verschiedene Systempfade für Win&Mac - aber wie für Linux

Beitrag von GPI »

Bei jeden System gibts es Verzeichnisse wie Dokumente, Music, Video, Downloads etc. Diese kann man auch schön abfragen, für Mac und Windows ist das für mich kein Problem
Mein Code bisher:

Der Windows-Code benötigt minimum Vista! - anders kommt man an den Downloads-Ordner nicht heran bzw. der existiert vorher auch nicht. Da XP/2000 eh veraltet sind und man die nicht mehr verwenden sollte, ist das ganze imo weniger Problematisch.

Code: Alles auswählen

;    Description: Find several System/User default folders
;         Author: GPI
;           Date: 04-12-2015
;     PB-Version: 5.40
;             OS: Windows, Linux, Mac
;  English-Forum: 
;   French-Forum: 
;   German-Forum: 
; -----------------------------------------------------------------------------

DeclareModule Directory
  Global Program.s;Need Admin/Root-Rights for Windows & Linux
  Global Documents.s
  Global Desktop.s
  Global Downloads.s
  Global ProgramData.s
  Global AllUserData.s;On Linux you must create with root rights a folder here and give access for everybody.
  Global Movies.s
  Global Music.s
  Global Pictures.s
  Global Public.s
  Global Temporary.s
  Global Home.s
EndDeclareModule

Module Directory
  EnableExplicit
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS;{      
      Procedure.s GetPath(NSSearchPathDirectory,NSDomainMask)        
        Protected ret.s
        Protected x,y,z
        Protected FileManager
        Protected URLArray
        FileManager = CocoaMessage(0, 0, "NSFileManager defaultManager")
        URLArray = CocoaMessage(0, FileManager,
                                "URLsForDirectory:", NSSearchPathDirectory,
                                "inDomains:", NSDomainMask)
        If URLArray          
          If CocoaMessage(0,URLArray,"count")=1
            x=CocoaMessage(0, URLArray, "objectAtIndex:", 0)
            y=CocoaMessage(0, x, "path")
            z=CocoaMessage(0, y,"UTF8String")
            ret= PeekS(z, -1, #PB_UTF8)+"/";PB always has a slash at the end
          EndIf
        EndIf
        ProcedureReturn ret
      EndProcedure
      Macro _Create(xx,cc,dd=#NSUserDomainMask)
        xx=GetPath(cc,dd)
      EndMacro
      _Create(Program,#NSApplicationDirectory)
      _Create(Documents,#NSDocumentDirectory)
      _Create(Desktop,#NSDesktopDirectory)
      _Create(Downloads,#NSDownloadsDirectory)
      _Create(ProgramData,#NSApplicationSupportDirectory)
      _Create(AllUserData,#NSApplicationSupportDirectory,#NSLocalDomainMask)
      _Create(Movies,#NSMoviesDirectory)
      _Create(Music,#NSMusicDirectory)
      _Create(Pictures,#NSPicturesDirectory)
      _Create(Public,#NSSharedPublicDirectory)
      ;}
      
    CompilerCase #PB_OS_Windows;{      
      Prototype Prot_SHGetKnownFolderPath(rfid,dwFlags,hToken,*pppszPath) 
      Define shell32dll=OpenLibrary(#PB_Any, "shell32.dll")
      Global SHGetKnownFolderPath_.Prot_SHGetKnownFolderPath=GetFunction(shell32dll, "SHGetKnownFolderPath")
      
      Procedure.s GetPath(*FOLDERID)
        Protected Path
        Protected ret.s        
        If SHGetKnownFolderPath_(*FOLDERID,0,0,@Path)=#S_OK And Path
          ret=PeekS(Path,-1,#PB_Unicode)+"\"
          CoTaskMemFree_(path)
        EndIf
        ProcedureReturn ret
      EndProcedure

      Macro _Create(xx,cc,d1,d2,d3,d4,d5)
        DataSection
          cc:
          Data.l $d1
          Data.w $d2,$d3
          Data.b ($d4>>8)&$ff,($d4)&$ff
          Data.b ($d5>>(5*8))&$FF,($d5>>(4*8))&$FF,($d5>>(3*8))&$FF,($d5>>(2*8))&$FF,($d5>>(1*8))&$FF,$d5&$FF
        EndDataSection
        xx=GetPath(?cc)
      EndMacro
      _Create(Program,FOLDERID_ProgramFiles,905e63b6,c1bf,494e,b29c,65b732d3d21a)
      _Create(Documents,FOLDERID_Documents,FDD39AD0,238F,46AF,ADB4,6C85480369C7)
      _Create(Desktop,FOLDERID_Desktop,B4BFCC3A,DB2C,424C,B029,7FE99A87C641)
      _Create(Downloads,FOLDERID_Downloads,374DE290,123F,4565,9164,39C4925E467B)
      _Create(ProgramData,FOLDERID_RoamingAppData,3EB685DB,65F9,4CF6,A03A,E3EF65729F3D)
      _Create(AllUserData,FOLDERID_ProgramData,62AB5D82,FDC1,4DC3,A9DD,070D1D495D97)
      _Create(Movies,FOLDERID_Videos,18989B1D,99B5,455B,841C,AB7C74E4DDFC)
      _Create(Music,FOLDERID_Music,4BD8D571,6D19,48D3,BE97,422220080E43)
      _Create(Pictures,FOLDERID_Pictures,33E28130,4E1E,4676,835A,98395C3BC3BB)
      _Create(Public,FOLDERID_PublicDocuments,ED4824AF,DCE4,45A8,81E2,FC7965083634)
      ;}
      
    CompilerCase #PB_OS_Linux
      Define ff
      Define key.s,line.s,path.s
      Define pos_equal,pos_quote1,pos_quote2
      FF  = ReadFile(#PB_Any, GetHomeDirectory() + ".config/user-dirs.dirs")
      ;ff=ReadFile(#PB_Any,"E:\purebasic\Temp\user-dirs.dirs")
      If FF
        While Not Eof(FF)
          line = ReadString(FF, #PB_UTF8)
          If Left(line,1)<>"#"
            
            pos_equal=FindString(line,"=")
            pos_quote1=FindString(line,~"\"",pos_equal+1)
            pos_quote2=FindString(line,~"\"",pos_quote1+1)
            If pos_equal And pos_quote1 And pos_quote1<pos_quote2
              key.s=UCase(Trim(Left(line,pos_equal-1)))
              path.s=Mid(line,pos_quote1+1,pos_quote2-pos_quote1-1)+"/"        
              path=ReplaceString(path,"$HOME/",GetHomeDirectory())
              Select key
                Case "XDG_DOCUMENTS_DIR":Documents=path
                Case "XDG_DESKTOP_DIR":Desktop=path
                Case "XDG_DOWNLOAD_DIR":Downloads=path
                Case "XDG_VIDEOS_DIR":Movies=path
                Case "XDG_MUSIC_DIR":Music=path
                Case "XDG_PICTURES_DIR":Pictures=path
                Case "XDG_PUBLICSHARE_DIR":Public=path
              EndSelect
              
            EndIf
          EndIf
          
        Wend
        CloseFile(FF)
      EndIf
      ProgramData=GetHomeDirectory()+"."
      Program="/usr/local/bin/";https://wiki.ubuntuusers.de/Verzeichnisstruktur
      AllUserData="/var/local/";http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/var.html
      
  CompilerEndSelect
  Temporary= GetTemporaryDirectory()
  Home= GetHomeDirectory()
EndModule

;-Example
CompilerIf #PB_Compiler_IsMainFile
  Debug Directory::Program
  Debug Directory::Documents
  Debug Directory::Desktop
  Debug Directory::Downloads
  Debug Directory::ProgramData
  Debug Directory::AllUserData
  Debug Directory::Movies
  Debug Directory::Music
  Debug Directory::Pictures
  Debug Directory::Public
  Debug Directory::Temporary
  Debug Directory::Home
  
  Debug "----"
  Debug "Pictures-Directory:"
  path.s=Directory::Pictures
  dir=ExamineDirectory(#PB_Any,path,"*.*")
  If dir
    While NextDirectoryEntry(dir)
      Debug "  "+DirectoryEntryName(dir)+" "+DirectoryEntryType(dir)
    Wend
    FinishDirectory(dir)
  EndIf
CompilerEndIf
Dazu zwei Fragen:
a)Passt der Mac-Code so? Wenn ich das richtig sehe, hab ich Objecte erzeugt, aber ich hab keine Ahnung, ob man die vernichten muss - und wenn ja wie.

b) Wie löse ich das mit Linux? Ich hab keine Ahnung und auch kein System zum testen.
Zuletzt geändert von GPI am 04.12.2015 18:44, insgesamt 1-mal geändert.
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: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von ts-soft »

Es wäre ja für Linux relativ leicht, aber die Bezeichnungen sind leider der Sprache angepaßt.
Meist einfach im Homeverzeichnis ein Unterverzeichnis, aber die Bezeichnung ist nicht so einfach:
http://www.linuceum.com/Distros/osFilesystem.php

Code: Alles auswählen

; English-Systems:
Debug GetHomeDirectory() + "Pictures/"
; German-Systems:
Debug GetHomeDirectory() + "Bilder/"
Alles andere dann auf http://standards.freedesktop.org/basedi ... 01s02.html
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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von GPI »

Es gibt für Linux ernsthaft keine API um die Pfad abzufragen - besonders wenn sie von System zu System verschieden und lokalisiert sein können?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von RSBasic »

Das wäre wirklich suboptimal, wenn es sowas nicht geben würde.
Da ich kein Linux habe und davon keine Ahnung habe, habe ich mal gegoogelt und fand diesen Artikel:
https://wiki.ubuntuusers.de/Homeverzeichnis hat geschrieben: Vorgegebene Verzeichnisse

xdg-user-dirs ist ein Werkzeug, um gewisse Vorgaben für Programme zu schaffen, wo sie ihre Daten ablegen sollen. So wird hier beispielsweise der Pfad zur Arbeitsfläche (früher Desktop) oder Ordner für Musik oder Video-Dateien definiert.

Diese Verzeichnisse gelten über Desktop-Umgebungen hinweg, solange sich diese an die Normen von freedesktop.org halten. Die Verzeichnisse werden über die Konfigurationsdatei ~/.config/user-dirs.dirs festgelegt. So bezeichnen alle Desktop-Umgebungen immer den Ordner ~/Schreibtisch oder ~/Arbeitsfläche (früher auch ~/Desktop) als Desktop usw. Die Standardeinstellungen für neu angelegte Benutzer bei Ubuntu 14.04 lauten beispielsweise:

Code: Alles auswählen

XDG_DESKTOP_DIR="$HOME/Schreibtisch"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Vorlagen"
XDG_PUBLICSHARE_DIR="$HOME/Öffentlich"
XDG_DOCUMENTS_DIR="$HOME/Dokumente"
XDG_MUSIC_DIR="$HOME/Musik"
XDG_PICTURES_DIR="$HOME/Bilder"
XDG_VIDEOS_DIR="$HOME/Videos"
Die Pfade werden bei manchen Ubuntu-Versionen automatisch aktualisiert. Ansonsten hilft es, sich ab- und wieder neu anzumelden. Nennt man beispielsweise den Ordner ~/Bilder in ~/Pictures um, so wird der Eintrag in user-dirs.dirs automatisch aktualisiert. Da man sich darauf aber nicht immer verlassen kann, wird empfohlen, nach der Umbenennung eines Ordners diese Datei zumindest zu kontrollieren und gegebenenfalls nachzubessern. Die Verzeichnisnamen lassen sich auch sehr einfach über die graphische Oberfläche von Ubuntu Tweak festlegen.
Man muss also die Umgebungsvariable "XDG_PICTURES_DIR" auslesen, die sich in der Datei "/.config/user-dirs.dirs" befindet.
Es gibt bestimmt auch eine API-Funktion zum Auslesen eines Pfades mit Hilfe einer Umgebungsvariable. Sowas muss geben.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von ts-soft »

Code: Alles auswählen

EnableExplicit

Define.s XDG_DESKTOP_DIR, XDG_DOWNLOAD_DIR, XDG_TEMPLATES_DIR, XDG_PUBLICSHARE_DIR
Define.s XDG_DOCUMENTS_DIR, XDG_MUSIC_DIR, XDG_PICTURES_DIR, XDG_VIDEOS_DIR

Define FF, string.s, tmp.s

FF  = ReadFile(#PB_Any, GetHomeDirectory() + ".config/user-dirs.dirs")
If FF
  While Not Eof(FF)
    string = ReadString(FF, #PB_UTF8)
    If Left(string, 4) = "XDG_"
      tmp = StringField(string, 1, "=")
      Select tmp
        Case "XDG_DESKTOP_DIR"
          XDG_DESKTOP_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_DESKTOP_DIR = ReplaceString(XDG_DESKTOP_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_DOWNLOAD_DIR"
          XDG_DOWNLOAD_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_DOWNLOAD_DIR = ReplaceString(XDG_DOWNLOAD_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_TEMPLATES_DIR"
          XDG_TEMPLATES_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_TEMPLATES_DIR = ReplaceString(XDG_TEMPLATES_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_PUBLICSHARE_DIR"
          XDG_PUBLICSHARE_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_PUBLICSHARE_DIR = ReplaceString(XDG_PUBLICSHARE_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_DOCUMENTS_DIR"
          XDG_DOCUMENTS_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_DOCUMENTS_DIR = ReplaceString(XDG_DOCUMENTS_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_MUSIC_DIR"
          XDG_MUSIC_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_MUSIC_DIR = ReplaceString(XDG_MUSIC_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_PICTURES_DIR"
          XDG_PICTURES_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_PICTURES_DIR = ReplaceString(XDG_PICTURES_DIR, "$HOME/", GetHomeDirectory()) + "/"
        Case "XDG_VIDEOS_DIR"
          XDG_VIDEOS_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
          XDG_VIDEOS_DIR = ReplaceString(XDG_VIDEOS_DIR, "$HOME/", GetHomeDirectory()) + "/"
      EndSelect
    EndIf
  Wend
  CloseFile(FF)
EndIf

Debug "Desktop = " + XDG_DESKTOP_DIR
Debug "Video = " + XDG_VIDEOS_DIR
Ich hoffe das hilft schon mal. Wenn noch mehr Pfade fehlen, dann bitte melden. Die stehen dann aber woanders.
Besser wäre es, vorher schon mal auf freedesktop.org nach zu schauen, da steht alles ist aber mit viel sucherei
verbunden :mrgreen:

Gruß
Thomas
Zuletzt geändert von ts-soft am 04.12.2015 00:47, insgesamt 3-mal geändert.
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
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von RSBasic »

:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von ts-soft »

Mußte es nochmals anpassen, jetzt sollte es stimmen. Naja, man wird älter und die Augen schlechter :mrgreen:
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
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: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von ts-soft »

Hier noch der integrierte Code, leider ohne Program() und ProgramData(). Sowas gibt es eigentlich so direkt nicht.
Auf Macros hab ich auch verzichtet, die machen mir immer Knoten im Hirn :mrgreen:

Code: Alles auswählen

DeclareModule Directory
  Declare.s Program()
  Declare.s Documents()
  Declare.s Desktop()
  Declare.s Downloads()
  Declare.s ProgramData()
  Declare.s Movies()
  Declare.s Music()
  Declare.s Pictures()
  Declare.s Public()
  Declare.s Temp()
  Declare.s Home()
EndDeclareModule

Module Directory
  EnableExplicit
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      
      Procedure.s GetPath(NSSearchPathDirectory)       
        Protected ret.s
        Protected c,x,y,z
        Protected FileManager
        Protected URLArray
        FileManager = CocoaMessage(0, 0, "NSFileManager defaultManager")
        URLArray = CocoaMessage(0, FileManager,
                                "URLsForDirectory:", NSSearchPathDirectory,
                                "inDomains:", #NSUserDomainMask)
        If URLArray
          c=CocoaMessage(0,URLArray,"count")
          If c=1
            x=CocoaMessage(0, URLArray, "objectAtIndex:", 0)
            y=CocoaMessage(0, x, "path")
            z=CocoaMessage(0, y,"UTF8String")
            ret= PeekS(z, -1, #PB_UTF8) + "/";PB always has a slash at the end
          EndIf
        EndIf
        ProcedureReturn ret
      EndProcedure
      Macro _Create(xx,cc)
        Procedure.s xx()
          ProcedureReturn GetPath(cc)
        EndProcedure
      EndMacro
      _Create(Program, #NSApplicationDirectory)
      _Create(Documents, #NSDocumentDirectory)
      _Create(Desktop, #NSDesktopDirectory)
      _Create(Downloads, #NSDownloadsDirectory)
      _Create(ProgramData, #NSApplicationSupportDirectory)
      _Create(Movies, #NSMoviesDirectory)
      _Create(Music, #NSMusicDirectory)
      _Create(Pictures, #NSPicturesDirectory)
      _Create(Public, #NSSharedPublicDirectory)
      
    CompilerCase #PB_OS_Windows
      
      Prototype Prot_SHGetKnownFolderPath(rfid, dwFlags, hToken, *pppszPath)
      Define shell32dll = OpenLibrary(#PB_Any, "shell32.dll")
      Global SHGetKnownFolderPath_.Prot_SHGetKnownFolderPath = GetFunction(shell32dll, "SHGetKnownFolderPath")
      
      Procedure.s GetPath(*FOLDERID)
        Protected Path
        Protected ret.s       
        If SHGetKnownFolderPath_(*FOLDERID, 0, 0, @Path) = #S_OK And Path
          ret=PeekS(Path, -1, #PB_Unicode) + "\"
          CoTaskMemFree_(path)
        EndIf
        ProcedureReturn ret
      EndProcedure
      
      Macro _Create(xx, cc, d1, d2, d3, d4, d5)
        DataSection
          cc:
          Data.l $d1
          Data.w $d2,$d3
          Data.b ($d4>>8)&$ff,($d4)&$ff
          Data.b ($d5>>(5*8))&$FF,($d5>>(4*8))&$FF,($d5>>(3*8))&$FF,($d5>>(2*8))&$FF,($d5>>(1*8))&$FF,$d5&$FF
        EndDataSection
        Procedure.s xx()
          ProcedureReturn GetPath(?cc)
        EndProcedure
      EndMacro
      _Create(Program,FOLDERID_ProgramFiles,905e63b6,c1bf,494e,b29c,65b732d3d21a)
      _Create(Documents,FOLDERID_Documents,FDD39AD0,238F,46AF,ADB4,6C85480369C7)
      _Create(Desktop,FOLDERID_Desktop,B4BFCC3A,DB2C,424C,B029,7FE99A87C641)
      _Create(Downloads,FOLDERID_Downloads,374DE290,123F,4565,9164,39C4925E467B)
      _Create(ProgramData,FOLDERID_RoamingAppData,3EB685DB,65F9,4CF6,A03A,E3EF65729F3D)
      _Create(Movies,FOLDERID_Videos,18989B1D,99B5,455B,841C,AB7C74E4DDFC)
      _Create(Music,FOLDERID_Music,4BD8D571,6D19,48D3,BE97,422220080E43)
      _Create(Pictures,FOLDERID_Pictures,33E28130,4E1E,4676,835A,98395C3BC3BB)
      _Create(Public,FOLDERID_PublicDocuments,ED4824AF,DCE4,45A8,81E2,FC7965083634)
      
    CompilerCase #PB_OS_Linux
      
      Global.s XDG_DESKTOP_DIR, XDG_DOWNLOAD_DIR, XDG_TEMPLATES_DIR, XDG_PUBLICSHARE_DIR
      Global.s XDG_DOCUMENTS_DIR, XDG_MUSIC_DIR, XDG_PICTURES_DIR, XDG_VIDEOS_DIR
      
      Define FF, string.s, tmp.s
      
      FF  = ReadFile(#PB_Any, GetHomeDirectory() + ".config/user-dirs.dirs")
      If FF
        While Not Eof(FF)
          string = ReadString(FF, #PB_UTF8)
          If Left(string, 4) = "XDG_"
            tmp = StringField(string, 1, "=")
            Select tmp
              Case "XDG_DESKTOP_DIR"
                XDG_DESKTOP_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_DESKTOP_DIR = ReplaceString(XDG_DESKTOP_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_DOWNLOAD_DIR"
                XDG_DOWNLOAD_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_DOWNLOAD_DIR = ReplaceString(XDG_DOWNLOAD_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_TEMPLATES_DIR"
                XDG_TEMPLATES_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_TEMPLATES_DIR = ReplaceString(XDG_TEMPLATES_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_PUBLICSHARE_DIR"
                XDG_PUBLICSHARE_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_PUBLICSHARE_DIR = ReplaceString(XDG_PUBLICSHARE_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_DOCUMENTS_DIR"
                XDG_DOCUMENTS_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_DOCUMENTS_DIR = ReplaceString(XDG_DOCUMENTS_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_MUSIC_DIR"
                XDG_MUSIC_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_MUSIC_DIR = ReplaceString(XDG_MUSIC_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_PICTURES_DIR"
                XDG_PICTURES_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_PICTURES_DIR = ReplaceString(XDG_PICTURES_DIR, "$HOME/", GetHomeDirectory()) + "/"
              Case "XDG_VIDEOS_DIR"
                XDG_VIDEOS_DIR = RemoveString(StringField(string, 2, "="), #DQUOTE$)
                XDG_VIDEOS_DIR = ReplaceString(XDG_VIDEOS_DIR, "$HOME/", GetHomeDirectory()) + "/"
            EndSelect
          EndIf
        Wend
        CloseFile(FF)
      EndIf
      Procedure.s Program()
        ;???
      EndProcedure
      Procedure.s Documents()
        ProcedureReturn XDG_DOCUMENTS_DIR
      EndProcedure
      Procedure.s Desktop()
        ProcedureReturn XDG_DESKTOP_DIR
      EndProcedure
      Procedure.s Downloads()
        ProcedureReturn XDG_DOWNLOAD_DIR
      EndProcedure
      Procedure.s ProgramData()
        ;???
      EndProcedure
      Procedure.s Movies()
        ProcedureReturn XDG_VIDEOS_DIR
      EndProcedure
      Procedure.s Music()
        ProcedureReturn XDG_MUSIC_DIR
      EndProcedure
      Procedure.s Pictures()
        ProcedureReturn XDG_PICTURES_DIR
      EndProcedure
      Procedure.s Public()
        ProcedureReturn XDG_PUBLICSHARE_DIR
      EndProcedure    
  CompilerEndSelect
  Procedure.s Temp()
    ProcedureReturn GetTemporaryDirectory()
  EndProcedure
  Procedure.s Home()
    ProcedureReturn GetHomeDirectory()
  EndProcedure
EndModule

Debug Directory::Program()
Debug Directory::Documents()
Debug Directory::Desktop()
Debug Directory::Downloads()
Debug Directory::ProgramData()
Debug Directory::Movies()
Debug Directory::Music()
Debug Directory::Pictures()
Debug Directory::Public()
Debug Directory::Temp()
Debug Directory::Home()

Debug "----"
Debug "Pictures-Directory:"
path.s=Directory::Pictures()
dir=ExamineDirectory(#PB_Any,path,"*.*")
If dir
  While NextDirectoryEntry(dir)
    Debug "  "+DirectoryEntryName(dir)+" "+DirectoryEntryType(dir)
  Wend
  FinishDirectory(dir)
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
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von GPI »

Program-Data wird eigentlich unter Home bei Linux mit einen "." in Ordnernamen abgespeichert. Dementsprechend wäre das dann GetHomeDirectory()+"."
Wohin werden denn bei Linux die Programme hininstalliert? Irgendwo müssen die doch auch landen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Verschiedene Systempfade für Win&Mac - aber wie für Linu

Beitrag von NicTheQuick »

Na normalerweise installiert man Programme als root, d.h. die installieren sich dann in /usr/bin, /bin, /var/lib, /lib, /usr/share, /opt, usw. Je nachdem, was es für eine Anwendung ist und mit welchem Prefix sie kompiliert wurde und auf welchem Linux du zu Hause bist. Ein Programme-Verzeichnis im Userspace existiert nicht. Ich nutze dafür aber z.B. /home/nicolas/programme. Da ist unter anderem Purebasic drin und ein paar eclipse-Installationen, und noch anderer Kram, mit dem ich nicht meine root-Partition zumüllen will bzw. den man unproblematisch in seinem Home-Verzeichnis lassen kann und der auch in jedem Linux funktioniert, das das selbe Home-Verzeichnis nutzt.
Antworten