Seite 1 von 2
CreateDirectoryEx (crossplattform)
Verfasst: 09.01.2014 20:00
von ts-soft
/edit
Windows Teil nach Tipp von RSBasic angepaßt, danke
Diese simple kleine Procedure erzeugt alle nicht vorhandene Verzeichnisse in einem Rutsch.
Code: Alles auswählen
EnableExplicit
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
CompilerElse
ImportC ""
system(cmd.p-utf8)
EndImport
CompilerEndIf
Procedure CreateDirectoryEx(DirPath.s)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
RunProgram(GetEnvironmentVariable("COMSPEC"), "/c mkdir " + #DQUOTE$ + DirPath + #DQUOTE$, "", #PB_Program_Wait | #PB_Program_Hide)
If FileSize(DirPath) = -2
ProcedureReturn #True
EndIf
CompilerDefault
If Not system("mkdir -p " + #DQUOTE$ + DirPath + #DQUOTE$)
ProcedureReturn #True
EndIf
CompilerEndSelect
EndProcedure
Define.s Path = GetHomeDirectory() + "test1/test2/tesatäöü"
Debug CreateDirectoryEx(Path)
Ergebnis #True bei Erfolg (es wurde mind. ein Verzeichnis erstellt, sollten alle Verzeichnisse bereits existieren, gibt es #False!)
Vielleicht kanns ja jemand brauchen
Gruß
Thomas
Re: CreateDirectoryEx (crossplattform)
Verfasst: 09.01.2014 20:05
von RSBasic
Danke fürs Teilen.
Aber ich bevorzuge MakeSureDirectoryPathExists, weil ein kurz sichtbares Konsolenfenster geht überhaupt nicht.

Re: CreateDirectoryEx (crossplattform)
Verfasst: 09.01.2014 20:10
von ts-soft
Wenn Du Unicode-Unterstützung benötigst, ist das aber eine schlechte Wahl, da nimm lieber:
SHCreateDirectoryEx()
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Ich wollte das man die Ähnlichkeit der API sieht

Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 12:59
von NicTheQuick
Wieso baust du dann nicht einfach diese Funktion in deinen CrossPlatform-Code aus dem ersten Post hier ein? Ein Consolenfenster ist in der Tat hässlich.
Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 13:10
von ts-soft
Weil die API nur unter bestimmten Windows Versionen verfügbar ist, die DLL geladen werden
muß und der ganze Code dann gross und schmutzig wird
Da würde ich dann lieber eine Rekursive Procedure nutzen, als diese API.
Hier wollte ich eine möglichst einfache und kurze Möglichkeit vorstellen und da ich
zur Zeit in erster Linie kein Windows nutze, war das erstmal unwichtig

Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 14:29
von RSBasic
Alternativ kann man auch für Windows folgendes nutzen:
Code: Alles auswählen
RunProgram("cmd", "/c md D:\aaaaaaa\abc\test123\", "", #PB_Program_Hide)
Der Pfad muss nur übergeben werden.
Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 14:29
von NicTheQuick
Okay, verstehe ich soweit. Na vielleicht will ja RSBasic dann seine Windows-API-Künste mit einbringen. Ich fänd's halt schon geil, wenn viele dieser Befehle, die es standardmäßig nicht in PB gibt, Crossplatform-mäßig umsetzen könnte. RSBasic pflegt ja eine große Sammlung solcher Codes, die aber hauptsächlich nur von Windows unterstützt werden. Diese Sammlung könnte man ja nach und nach erweitern und mittels Compiler-Switches crossplatform-kompatibel machen.
Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 14:57
von ts-soft
Hab den Code im ersten Beitrag jetzt angepasst (danke an RSBasic für den Tipp mit RunProgram!)
Gruß
Thomas
Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 15:18
von NicTheQuick
Wie wäre es mit '#PB_Program_Wait' oder einem 'WaitProgram()' statt dem Delay? Vielleicht kann man sogar mit 'ProgramExitCode()' feststellen, ob 'mkdir' erfolgreich war oder nicht. Allerdings steht das in der Hilfe von 'mkdir' nicht drin. Und ausprobieren kann ich es nicht. Unter Linux steht der ExitCode 0 üblicherweise für eine erfolgreiche Ausführung.
Re: CreateDirectoryEx (crossplattform)
Verfasst: 10.01.2014 15:22
von ts-soft
NicTheQuick hat geschrieben:Unter Linux steht der ExitCode 0 üblicherweise für eine erfolgreiche Ausführung.
Unter Windows auch

, wobei hierbei zu beachten ist, wenn alle Verzeichnisse bereits
vorhanden waren, also nichts erstellt wurde, wird unter Windows ein Fehler gemeldet.
Delay durch #PB_Program_Wait ersetzt

, danke für den Hinweis