Chemin Relatif

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Chemin Relatif

Message par Thyphoon »

Voilà je partage une petite procedure que je me suis fait qui permet de transformer un chemin absolu en chemin relatif C'est tres pratique :)

Code : Tout sélectionner

Procedure.s RelativePath(FromPath.s,Path.s)
  Protected l.w,c.w,NewPath.s
  Newpath.s=""
  c=0
  For l=Len(FromPath) To 1 Step -1 ; On lit a l'envers
  
    If Mid(FromPath,l,1)="\" ; A chaque fois que je trouve un nouveau repertoire on compte
       c+1
    
       If FindString(Path,Mid(FromPath,1,l),1) ; Si on retrouve alors le même chemin commun que le chemin original alors on casse la boucle
         Break
       EndIf 
  
    EndIf
  
  Next l
  
  For z=1 To c-1
    Newpath+"..\"
  Next
  Newpath+Right(Path,Len(Path)-l)
  ProcedureReturn NewPath
EndProcedure
exemple :

Code : Tout sélectionner

File.s="C:\Documents And Settings\lebrun_y\Mes documents\Developpement\Planetes Aliens\MapEditor\Sfx\porte.wav"
Path.s="C:\Documents And Settings\lebrun_y\Mes documents\Developpement\Planetes Aliens\MapEditor\"

Debug RelativePath(Path,File)

voilà :) la fonction peut surement être améliorer. Mais ça marche bien !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Chemin Relatif

Message par Backup »

Thyphoon a écrit :Voilà je partage une petite procedure que je me suis fait qui permet de transformer un chemin absolu en chemin relatif C'est tres pratique :)
voilà :) la fonction peut surement être améliorer. Mais ça marche bien !
8O ça me renvoie ce que je lui donne dans "File.s"

donc je vois pas l'interet !?? t'es sur que ça marche ton truc ? 8O
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

c'est currieux ça ...
Enfin non c'est normal si il n'y a pas de chemin commun entre file et frompath

tient regarde ce code

Code : Tout sélectionner

Procedure.s RelativePath(FromPath.s,Path.s)
  Protected l.w,c.w,NewPath.s
  Newpath.s=""
  c=0
  For l=Len(FromPath) To 1 Step -1 ; On lit a l'envers
  
    If Mid(FromPath,l,1)="\" ; A chaque fois que je trouve un nouveau repertoire on compte
       c+1
    
       If FindString(Path,Mid(FromPath,1,l),1) ; Si on retrouve alors le même chemin commun que le chemin original alors on casse la boucle
         Break
       EndIf 
  
    EndIf
  
  Next l
  
  For z=1 To c-1
    Newpath+"..\"
  Next
  Newpath+Right(Path,Len(Path)-l)
  ProcedureReturn NewPath
EndProcedure

File.s="C:\Documents And Settings\lebrun_y\Mes documents\Developpement\Planetes Aliens\MapEditor\Sfx\porte.wav"
Path.s="C:\Documents And Settings\lebrun_y\Mes documents\Developpement\Planetes Aliens\MapEditor\"

Debug RelativePath(Path,File) 
Le but étant de trouver le chemin non pas a partir de la racine mais a partir du "frompath"
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chez moi ça reviens a faire


file.s= "D:\Mes_Photos\Capture_ecran\puregolo3D\croix.jpg"
chemin$= Right (file.s, Len (file.s)-3)
Debug chemin$


8O 8O

c'est ça ? 8O

[Reedit]
ha non ! , je vois ok ! autant pour moi :D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

lollllllllllllllllll

bon je te fais un programme pour te montrer exactement

Code : Tout sélectionner

Procedure.s RelativePath(FromPath.s,Path.s)
  Protected l.w,c.w,NewPath.s
  Newpath.s=""
  c=0
  For l=Len(FromPath) To 1 Step -1 ; On lit a l'envers
  
    If Mid(FromPath,l,1)="\" ; A chaque fois que je trouve un nouveau repertoire on compte
       c+1
    
       If FindString(Path,Mid(FromPath,1,l),1) ; Si on retrouve alors le même chemin commun que le chemin original alors on casse la boucle
         Break
       EndIf 
  
    EndIf
  
  Next l
  
  For z=1 To c-1
    Newpath+"..\"
  Next
  Newpath+Right(Path,Len(Path)-l)
  ProcedureReturn NewPath
EndProcedure 
 
 File$=OpenFileRequester("Selectionne  un fichier", FichierParDefaut$, Filtre$, Filtre)
While File$

       Debug RelativePath(GetCurrentDirectory(),File$);RemoveString(File$, GetCurrentDirectory()) 
File$ = NextSelectedFileName()
Wend

donc tu compiles et tu prend un fichier ou tu veux... :) et normalement au lieu de te mettre un chemin style c:\truc\bidule\machin\chose\monfichier.ext et bien tu aura le chemin a partir du repertoire ou a été executer ton programme (il faut peut être sauvegarder la source) et donc dans le genre ..\..\chose\monfichier.ext

dit moi si ça marche...lollllll D'autre on essayé ?
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

Je viens d'essayer, car au début je comprenais pas trop le but, mais maintenant
je vois nettement mieux. Ta routine est en effet très pratique dans certains
cas. Maintenant, je n'ai pas analysé le code.
Mais je la garde dans un petit coin, cela me servira, c'est sur :wink:
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ok ! super , je garde aussi :D

[Reedit] voila c'est sur mon Forum de Code_fr :D [/Reedit]

Merci :D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Chouette ! pour une fois ou je fais quelques chose qui peut être utile :P
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Petite correction

Sur le forum Anglais quelqu'un m'a fait remarquer que si le fichier se trouvait sur une autre unité (disque dur) alors ...ça pausait un problème

voilà qui devrait régler le problème !! :)

Code : Tout sélectionner

Procedure.s RelativePath(FromPath.s,Path.s)
  Protected l.w,c.w,NewPath.s
  Newpath.s=""
  c=0
;   Debug Path
;   Debug FromPath
;   Debug  Mid(Path,1,1)
;   Debug Mid(FromPath,1,1)
  If Mid(Path,1,1)<>Mid(FromPath,1,1)
    ProcedureReturn Path
  EndIf
  For l=Len(FromPath) To 1 Step -1 ; We stat at the end of the string
 
    If Mid(FromPath,l,1)="\" ; I count all new folder
       c+1
   
       If FindString(Path,Mid(FromPath,1,l),1) ; If we have the same path we break the loop
         Break
       EndIf
 
    EndIf
 
  Next l
 
  For z=1 To c-1
    Newpath+"..\"
  Next
  Newpath+Right(Path,Len(Path)-l)
  ProcedureReturn NewPath
EndProcedure
 
 File$=OpenFileRequester("Choose a File", FichierParDefaut$, Filtre$, Filtre)
While File$
       Debug "Absolute Path:"+File$
       Debug "Relative Path:"+RelativePath(GetCurrentDirectory(),File$)
File$ = NextSelectedFileName()
Wend
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

juste un truc...on peut améliorant en utilisant

Code : Tout sélectionner

If Left(Path, 1) <> Left(FromPath), 1)
     ProcedureReturn Path
EndIF
au lieu de

Code : Tout sélectionner

  If Mid(Path,1,1)<>Mid(FromPath,1,1)
    ProcedureReturn Path
  EndIf 
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Je propose de profiter des possibilités de PB4, à savoir les paramètres optionnels

Code : Tout sélectionner

Procedure.s RelativePath(Path.s, FromPath.s = "")
  Protected l.w,c.w,NewPath.s
  Newpath.s=""
  c=0
  
  If Not FromPath
    FromPath = GetCurrentDirectory()
  EndIf
  
  If Left(Path, 1) <> Left(FromPath, 1)
    ProcedureReturn Path
  EndIf
  
  For l=Len(FromPath) To 1 Step -1
 
    If Mid(FromPath, l, 1)="\"
       c+1
   
       If FindString(Path, Left(FromPath,l), 1)
         Break
       EndIf
 
    EndIf
 
  Next l
 
  For z=1 To c-1
    Newpath+"..\"
  Next
  
  Newpath+Right(Path, Len(Path)-l)
  
  ProcedureReturn NewPath
EndProcedure
 
 File$=OpenFileRequester("Choose a File", FichierParDefaut$, Filtre$, Filtre)
While File$
       Debug "Absolute Path:"+File$
       Debug "Relative Path:"+RelativePath(File$)
File$ = NextSelectedFileName()
Wend
Dri
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Très bonne idée Dr. Dri :D
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Message par GG »

Excellent...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Je n'avais pas pigé non plus, maintenant si :)
Elle s'avérer bien pratique effectivement.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Ar-S a écrit :Je n'avais pas pigé non plus, maintenant si :)
Elle s'avérer bien pratique effectivement.
lolllll comme quoi parfois je dis des choses interessantes (Ok c'est pas souvant :wink: )
Répondre