CreateDirectoryPath()

Anfängerfragen zum Programmieren mit PureBasic.
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 »

Weißt Du wieviele ungültige Stringkombinationen da noch möglich sind?
Für jeden Teilbereich des Pfades mußte zumindest noch CheckFilename()
ausführen. :mrgreen:
Slash und doppelte Backslashes stören Windows eigentlich garnicht, alles andere muß getestet werden.
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 »

> Slash und doppelte Backslashes stören Windows eigentlich garnicht
Da gebe ich dir Recht! Aber schon mal dran gedacht, was passiert, wenn dir ein Installer so einen verkorksten (aber funzenden) Pfad in die Registry schreibt? :lol:

@ String:
Mit dem alles-Code-in-einer-Zeile-quetschen kann man's auch übertreiben, davon wird der Code nicht schneller :wink:


Nur, um mal sicherzugehen, dass es keine vielfachen Slashes mehr gibt, weil vielleicht ein Grobmotoriker einen pfad eingegeben haben könnte:

Code: Alles auswählen

Procedure CreateDirectoryPath(path.s)
	path+"\"
	While CountString(path, "\\")
		path=ReplaceString(path, "\\", "\")
	Wend
	ProcedureReturn MakeSureDirectoryPathExists_(@path)
EndProcedure
:mrgreen:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
String
Beiträge: 69
Registriert: 17.05.2007 16:22

Beitrag von String »

Weißt Du wieviele ungültige Stringkombinationen da noch möglich sind?
@ts-soft
Wozu denn?
Dafür sorgt halt die API.
Es ging zum Schluss doch nur noch um die Falsche Information der API.
Sollte sich ein unerlaubtes Zeichen eingeschlichen haben
meldet die MakeSure.. doch 0 zurück.

@AND51 Super!
Darauf kann man doch aufbauen.
Ich glaube ich habe meine Variante gefunden.
So hat man auch gleich den Korrigierten Pfadnamen zurück.

Code: Alles auswählen

Procedure.s CreateTopDirectory(path.s)
  path+"\"
  While CountString(path, "\\")
    path=ReplaceString(path, "\\", "\")
  Wend
  If MakeSureDirectoryPathExists_(@path.s)
    ProcedureReturn path.s
  EndIf
EndProcedure

Debug CreateTopDirectory("c:\Test\testA\testX")
Debug CreateTopDirectory("c:\Test\\\\testA\\\testZ\\\\\")

PB v4.**
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@Kaeru
Kaeru Gaman hat geschrieben:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows 
  #Seperator$ ="" ; für Windows 
CompilerElse 
  #Seperator$ ="/" ; für MacOS, Linux 
CompilerEndIf
Ja, irgendwie hatte es mir auch noch nicht gefallen mit der globalen Variable. Aber weißt ja, wie es manchmal ist, da fällt es einem einfach nicht ein :(

Hab mich da schon oft gefragt, ob es da nicht schon eine Konstante von PB aus gibt und wenn nein, wieso nicht.

Genauso das ZeilenUmbruchzeichen. Immer muss man da irgendwas mit Charactern machen :cry:

Das macht es hier und da etwas kompliziert.

zu AND51 und ts-Soft
Ziel war es ja, dass es auch auf einem Mac läuft. Und ts-soft, nutzt du nicht selbst auch Linux. Wie machste es denn da?

Meine Routine, die ich am Anfang gepostet hatte, dient erstmal dazu, dass die Verzeichnisse erstellt werden. Ob man nun den Pfad mit Slash, mit falschen Zeichen oder sonst irgendwie an die Prozedur liefert, steht ja wieder auf einem anderen Blatt.

Wenn man vorher einen Requester benutzt, oder eine Verzeichnisliste hat, genauso kann man noch einen Slash ransetzen oder nicht.

Denke aber mit dem Nachtrag von Kaeru ist die Prozedur wohl schon eine gute Lösung. Zu mindest hab ich nicht viel was anderes gesehen.
al90 hat geschrieben:

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") 
Wieso fängt dein "i" erst bei vier an? versuchst du damit "C:" zu übersprinen? :? (Gibt es sowas bei MacOS und Linux?) :shock:

@String
CreateTopDirectory("C:\hallo/paul...?\klaus//tach post*\>>Maus<<\::Pure|y|BasIc")
:freak:

Wenn man gut ist, funktioniert die Prozedur auch für URLs.
Natürlich mit der entsprechenden richtigen Anpassung.

:allright:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Xaby hat geschrieben:Hab mich da schon oft gefragt, ob es da nicht schon eine Konstante von PB aus gibt und wenn nein, wieso nicht.

Genauso das ZeilenUmbruchzeichen. Immer muss man da irgendwas mit Charactern machen :cry:
vielleicht gibt es schon eine native konstante, davon gibt es ja SO viele, die kann man garnicht alle kennen.

für zeilenumbrüche gibt es konstanten.
#CR$
#LF$
#CRLF$
#LFCR$
sind alle vordefiniert

erweitere mal die liste in deinem autocomplete.
die liste wird zwar ahsig lang, aber man entdeckt manchmal dinge, die man noch nicht kannte... xD
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

Xaby hat geschrieben:Wieso fängt dein "i" erst bei vier an? versuchst du damit "C:" zu übersprinen? :? (Gibt es sowas bei MacOS und Linux?) :shock:
Das ist eine reine Windows spezifische routine. Mit Linux & MacOS kenne
ich mich nicht aus. Der vorteil bei meiner variante ist aber das nicht nur
bei erfolgreichen erstellen "-2" zurückgeliefert wird, sondern auch wenn
das Directory bereits existiert. Denn das wäre ja im grunde auch ein erfolg
das das Dir vorhanden ist. Hängt aber natürlich alles vom einsatzziel ab.
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 »

Sowieso alles Humbug :mrgreen:
Bei einem Installer muß ich die Gültigkeit des Namens bei der Eingabe
prüfen, nicht wenn ich den Pfad erstelle. Weil ich ja bei ungültigen Namen
weder den freien Festplattenplatz anzeigen kann, noch den "weiter-button"
aktivieren darf, der den Ordner erstellt.

Aber mir glaubt ja keiner :cry: :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 »

Wie gesagt, hängt alles vom einsatzziel ab. Ich brauchte die routine für
Kopiervorgänge in PFM. Da wäre es blöd wenn jedesmal bei einem bereits
existierendem verzeichniss eine Fehlermeldung kommen würde. :mrgreen:
Ausserdem werden die Dirs in meinem fall per Examine() ausgelesen. Also nix mit
Handeingabe. :mrgreen: Ausser bei MkDir oder Rename. Aber da benutze
ich eh vorher Checkfilename().
Benutzeravatar
String
Beiträge: 69
Registriert: 17.05.2007 16:22

Beitrag von String »

@ts-soft
Sowieso alles Humbug
Nicht für mich!
Zufälligerweise brauchte ich eine Pfad Erstellung
die auch gegen groben Unfug gesichert ist.
Da kam mir der Beitrag grade recht. Die Basis hab ich ja jetzt gefunden.
Noch einige Änderungen und die Procedure ist für meine Bedürfnisse genau richtig.

@al90
Da wäre es blöd wenn jedesmal bei einem bereits
existierendem verzeichniss eine Fehlermeldung kommen würde.
Bei der API ich glaube (ts-soft hat sie als erster entdeckt.)
kommt keine Fehlermeldung die gibt 1 zurück also OK!
PB v4.**
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

String hat geschrieben:Bei der API ich glaube (ts-soft hat sie als erster entdeckt.)
kommt keine Fehlermeldung die gibt 1 zurück also OK!
Mag schon sein. Aber damals kannte ich den API-Befehl noch nicht und hatte
mir diese Proc dafür geschrieben.
Antworten