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 :wink:

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. :allright:
Aber ich bevorzuge MakeSureDirectoryPathExists, weil ein kurz sichtbares Konsolenfenster geht überhaupt nicht. :wink:

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 :mrgreen:

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 :mrgreen:
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 :mrgreen:

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 :wink: , 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 :wink: , danke für den Hinweis