Verschiedene Systempfade für Win&Mac - aber wie für Linux
Verfasst: 03.12.2015 19:24
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.
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.
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
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.