CreateDirectoryEx (crossplattform)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
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

CreateDirectoryEx (crossplattform)

Beitrag 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
Zuletzt geändert von ts-soft am 10.01.2014 15:33, insgesamt 2-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: CreateDirectoryEx (crossplattform)

Beitrag von RSBasic »

Danke fürs Teilen. :allright:
Aber ich bevorzuge MakeSureDirectoryPathExists, weil ein kurz sichtbares Konsolenfenster geht überhaupt nicht. :wink:
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: CreateDirectoryEx (crossplattform)

Beitrag 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:
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
NicTheQuick
Ein Admin
Beiträge: 8807
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: CreateDirectoryEx (crossplattform)

Beitrag 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.
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: CreateDirectoryEx (crossplattform)

Beitrag 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:
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: CreateDirectoryEx (crossplattform)

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: CreateDirectoryEx (crossplattform)

Beitrag 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.
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: CreateDirectoryEx (crossplattform)

Beitrag von ts-soft »

Hab den Code im ersten Beitrag jetzt angepasst (danke an RSBasic für den Tipp mit RunProgram!)

Gruß
Thomas
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
NicTheQuick
Ein Admin
Beiträge: 8807
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: CreateDirectoryEx (crossplattform)

Beitrag 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.
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: CreateDirectoryEx (crossplattform)

Beitrag 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
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
Antworten