CreateDirectoryPath()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

CreateDirectoryPath()

Beitrag von Xaby »

Code: Alles auswählen

Global Seperator.s ;{
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Seperator.s="\" ; für Windows
CompilerElse
Seperator.s="/" ; für MacOS, Linux
CompilerEndIf ;}

Procedure CreateDirectoryPath(S.s,Sep.s)
  Static A.l
  Static d.s
  Static i.l
  A=CountString(S,Sep.s) 
  d=""
For i=1 To A+1
  d=d+StringField(S,i,Sep)+Sep
  CreateDirectory(d) ; Vorhandene Verzeichnisse werden nicht beachtet
Next
EndProcedure

CreateDirectoryPath(Path,Seperator)

Path kann man individuell wählen.
zum Beispiel: Path="C:\F\Test\Hallo\Welt\" ...
Seperator kann auch manuell auf "\" oder "/" gestellt werden.
Nutzt man das Wort Seperator, wird es automatisch gewählt.
Je nach dem, auf welchem System man es compiliert.

Man könnte noch überprüfen, ob das letzte Zeichen ein Seperator ist oder nicht, und wenn nicht, dann sollte eins gesetzt werden.
Aber so kann man zum Beispiel folgendes machen:

Code: Alles auswählen

Datei.s="C:\F\Test\Hallo\Welt\Paul.txt"
CreateDirectoryPath(Datei, "\")
If CreateFile(0,Datei)<>0
 CloseFile(0)
EndIf
Eigentlich wollte ich es ja zu Codes, Tipps und Tricks stellen, war mir aber nicht sicher, ob es wirklich so ein genialer Schachzug ist von mir, dass es sich lohnt, diesen Code dort auszustellen.

Ein Blick in die Suche oder ins CodeArchive hätte mir wohl auch die Lösung gebracht. :?

Ist es die beste Möglichkeit, um gleich einen ganzen Pfad erstellen zu lassen oder gibt es da schon einen durchdachten Befehl von PB aus sogar, den ich einfach nur übersehen habe?

Gruß, Folker :allright:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Hier mal meine variante die ich mir mal geschrieben hatte.

Code: Alles auswählen

Procedure.l MakeDirectoryGroup(Dir$)

Protected i, b$, c$
If Right(Dir$,1)<>"\" : Dir$+"\" : EndIf

If Mid(Dir$,2,2)=":\" And FileSize(Dir$)=-1
  c$=Left(Dir$,3)
  For i=4 To Len(Dir$)
    b$=Mid(Dir$,i,1)
    c$+b$
    If b$="\"
      CreateDirectory(c$)
    EndIf
  Next
EndIf

ProcedureReturn FileSize(Dir$)

EndProcedure

;Debug MakeDirectoryGroup("C:\windows\temp\Eins\Zwei\Drei")
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

Beitrag von ts-soft »

Unter Windows:

Code: Alles auswählen

MakeSureDirectoryPathExists_(path.s)
: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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich kanns kürzer, schneller und eleganter, als ihr *bähhh* (Windows Only) :lol:

Code: Alles auswählen

MakeSureDirectoryPathExists_(@"C:\Meine Lösung\haut euch\in\Grund und\Boden\")
Als Parameter muss ein Pointer zu einem Nullterminiertem String angegeben werden.

Das ist jetzt wirklich kein Witz, den Befehl gibt's wirklich! :wink:
Da seid ihr jetzt baff, was? :D

// Edit: Mist TS'si war faster... :twisted:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

<Gähn> Schon wieder alles API. :lol:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ Xaby:
Nett, dein CompilerIf, aber ich würde die Variable doch lieber in die Prozedur packen, statt außerhalb? Also als protected, statt global?!

@ TS-Soft:
Diese Funktion ist ein schönes Beispiel für meine nun folgende Frage: Die Funktion erwartet laut Hilfe einen Pointer zu einem nullterminiertem String. Warum funktioniert das auch, wenn ich ganz normale einen String eingebe, so wie in meinem Beispiel, nur hat ohne das @ ? Und ist das "gefährlich", wenn man das ohne Pointer macht?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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

Beitrag von ts-soft »

Mit @ ist korrekter. PB-Libs unterstützen aber auch den Any-Typ, der das
zuläßt. Also: korrekter ist so @Path.s und ncht so Path.s.
Was mich aber nicht davon abhält es ohne zu nutzen :mrgreen: , wenns in
der nächsten PB Version nicht mehr gehen sollte, fange ich ja nicht an zu
Weinen und melde Buggys :lol:
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
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

AND51 hat geschrieben:Warum funktioniert das auch, wenn ich ganz normale einen String eingebe, so wie in meinem Beispiel, nur hat ohne das @ ? Und ist das "gefährlich", wenn man das ohne Pointer macht?
Obs funktioniert oder nicht. Kopiere den ganzen kram lieber in einen String.

Bei sowas wie:

@"C:\Meine Lösung\haut euch\in\Grund und\Boden"

stehen mir die Haare zu Berge. :o :mrgreen:
Benutzeravatar
String
Beiträge: 69
Registriert: 17.05.2007 16:22

Beitrag von String »

Ich bin der Meinung dass die Erstellung eines Verzeichnisses mit äußerster Sorgfalt behandelt werden muss.
Und darum geht es doch hier auch.
Deshalb hab ich mir mal eine Methode ausgedacht die meiner Meinung nach ziemlich kugelsicher ist.

Code: Alles auswählen

Procedure CreateTopDirectory(path.s)  
  If Right(path.s,1)<>"\" : path.s+"\":EndIf:MakeSureDirectoryPathExists_(@path.s)
  If FileSize(path.s)=-2:ProcedureReturn 1:Else:ProcedureReturn 0:EndIf
EndProcedure


Debug Str(CreateTopDirectory("c:\System Volume Information\test")) + " = Teste einen Systemgeschützten Ordner WinXP" 
Debug Str(CreateTopDirectory("c:\Test\testA")) + " = Test ohne \"
Debug Str(CreateTopDirectory("c:\Test\testB\")) + " = Test mit \"
Debug Str(CreateTopDirectory("c:\Test\testA")) + " = Teste das Ergebnis eines  bestehenden  Verzeichnisses"
Debug Str(CreateTopDirectory("c:\Test\ÄÖÜßäüö.exe")) + " = Teste Blödsinnige Verzeichnisnamen" 
Debug Str(CreateTopDirectory("C:\Test\Meine Lösung\haut euch\in\Grund und\Boden\Und\durch\die\Erde")) + " = Gerne auch etwas länger"
Debug Str(CreateTopDirectory("C:\Test\Der\Super \Test")) + " = Der Supertest achte auf das  Leerzeichen"
Debug Str(CreateTopDirectory("c:Test\testC")) + " = Man ist die API gut"
Debug Str(CreateTopDirectory("c\Test\testC")) + " = Und bei einem vergessenen Doppelpunkt landet der Pfad hier. " + GetCurrentDirectory()

PB v4.**
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> die meiner Meinung nach ziemlich kugelsicher ist
Zu viel Aufwand!

Warum wertest du das Ergebnis nicht von MakeSure... direkt aus? 0=Fehler, alles andere=Erfolg
Warum einfach, wenn's auch kompliziert geht, was? :lol:

@ TS-Soft:
Was sind Any-Typen? Ich merke, es wird hier sehr PB-spezifisch. Gibt es dazu weitere Informationen?

> Obs funktioniert oder nicht. Kopiere den ganzen kram lieber in einen String
Du meinst in eine String-Variable? OK, da hast du recht. Mir geht es genauso wie dir. Hier habe ich es nur gemacht, um dem Threadersteller zu zeigen, wie's geht (gehen könnte).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten