Seite 1 von 4

CreateDirectoryPath()

Verfasst: 20.05.2007 18:24
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:

Verfasst: 20.05.2007 19:15
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")

Verfasst: 20.05.2007 19:23
von ts-soft
Unter Windows:

Code: Alles auswählen

MakeSureDirectoryPathExists_(path.s)
:mrgreen:

Verfasst: 20.05.2007 19:34
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:

Verfasst: 20.05.2007 19:37
von al90
<Gähn> Schon wieder alles API. :lol:

Verfasst: 20.05.2007 19:53
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?

Verfasst: 20.05.2007 19:59
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:

Verfasst: 20.05.2007 20:04
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:

Verfasst: 20.05.2007 21:26
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()


Verfasst: 20.05.2007 21:34
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).