Seite 3 von 4

Verfasst: 20.05.2007 22:36
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.

Verfasst: 20.05.2007 23:36
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:

Verfasst: 20.05.2007 23:53
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\\\\\")


Verfasst: 21.05.2007 08:29
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:

Verfasst: 21.05.2007 11:05
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

Verfasst: 21.05.2007 19:49
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.

Verfasst: 21.05.2007 20:09
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:

Verfasst: 21.05.2007 20:18
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().

Verfasst: 21.05.2007 21:10
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!

Verfasst: 21.05.2007 21:24
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.