GetLastName(FullDirectory.s)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

GetLastName(FullDirectory.s)

Message par Ar-S »

Petite procédure dont j'avais besoin pour choper le dernier nom d'un chemin que ce soit un fichier ou un dossier.
(Pour chopper le nom des villages dans un répertoire photos)
Fonctionne avec ou sans "/" à la fin du chemin :wink:

Un complément nécessaire à GetFilePart et GetPathPart :mrgreen: pour ma part.

Code : Tout sélectionner

Procedure.s GetLastName(FullDirectory.s)
  ; GetLastName("chemin complet") par Ar-S / 19/01/2012 PB 4.x
  ; Procedure de récupération du dernier nom de fichier ou dossier. 
  ; Le chemin peut être indiqué avec ou sans slash à la fin.
  
  If Right(FullDirectory, 1) = "\" 
    FullDirectory = Left(FullDirectory, Len(FullDirectory) - 1) 
  EndIf 
	ProcedureReturn GetFilePart(FullDirectory)
EndProcedure 

; Example 

; Test 1
dir$ = "c:\toto\tutu\moutarde\St Paul du Gigot\" ; avec slash
Debug GetLastName(dir$)

; Test 2
dir$ = "c:\toto\tutu\moutarde\Cornoulac sur biroutes" ; pas de slash
Debug GetLastName(dir$)

; Test 3
dir$ = "c:\Giclon sur futal" ; avec un seul slash
Debug GetLastName(dir$)

; Test 4
dir$ = "c:\poireau\courgette.exe" ; avec un nom de fichier
Debug GetLastName(dir$)

; Test 5
dir$ = "je mets n'importe quoi" ; sort toute la phrase
Debug GetLastName(dir$)

EnJoYeZ
Dernière modification par Ar-S le ven. 20/janv./2012 11:52, modifié 3 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: GetLastName(FullDirectory.s)

Message par case »

pour vérifier la validité du chemin ne devrais tu pas utiliser filesize() plutot que de regarder dans la string si il y a des \ ?


car un path tout a fait construit correctement peut ne pas exister sur le disque et être invalide.
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: GetLastName(FullDirectory.s)

Message par Ar-S »

C'est vrai que la vérif n'est pas vraiment utile.
pour vérifier la validité du chemin ne devrais tu pas utiliser filesize() plutot que de regarder dans la string
Le programme sert à retrouver le dernier nom d'un chemin, que celui-ci soit celui d'un dossier ou d'un fichier.
En fait mon programme utilise un pathrequester() pour récupérer le chemin complet et créer un fichier pref indiquant le nom de la ville ex : "c:\photos\vacances\grenoble\" va générer un fichier pref contenant ville = Grenoble

Je ne vois donc pas l'utilité du filesize ici.

----edit----

Si en fait j'ai fait cette vérif dans le cas ou un équidé (faisant hiihannn) ai l'idée de faire un GetLastName("tout sauf un chemin") comme dans le test 5 ;)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: GetLastName(FullDirectory.s)

Message par Le Soldat Inconnu »

En plus simple :mrgreen: Bon d'accord, je ne vérifie pas la validité du chemin

Code : Tout sélectionner

Procedure.s GetLastName(FullDirectory.s)
	If Right(FullDirectory, 1) = "\"
		FullDirectory = Left(FullDirectory, Len(FullDirectory) - 1)
	EndIf
	FullDirectory = GetFilePart(FullDirectory)
	ProcedureReturn FullDirectory
	
EndProcedure

; Example 

; Test 1
dir$ = "c:\toto\tutu\moutarde\St Paul du Gigot\" ; avec slash
Debug GetLastName(dir$)

; Test 2
dir$ = "c:\toto\tutu\moutarde\Cornoulac sur biroutes" ; pas de slash
Debug GetLastName(dir$)

; Test 3
dir$ = "c:\Giclon sur futal" ; avec un seul slash
Debug GetLastName(dir$)

; Test 4
dir$ = "c:\poireau\courgette.exe" ; avec un nom de fichier
Debug GetLastName(dir$)

; Test 5
dir$ = "je mets n'importe quoi" ; erreur
Debug GetLastName(dir$)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

En parlant de validité des chemins..je viens d'en apprendre une bonne hier :?
Comme on sait presque jamais si l'utilisateur ou la variable aura un anti-slash de fin, j'avais découvert une API de la mort comme je les aimes.
PathAddBackslash_() 8O
Ouaaah qu'elle etait belle celle la..elle te rajoute l'anti-slash que si besoin 8)
Alors KCC, sur d'avoir dans les main le saint graal et en bon bourrin, il en a fourré de partout dans tous ses codes :D

Et hier...que me prend il pas de regarder a quoi servent tous les outils de PB :roll:
Et je retombe sur l'option purifier :)
Donc je coche....et le premier depassement de mémoire tombe sur mon API d'amour 8O

Alors je cherches, "pourquoitaice" ???
Et la..le lis un truc qui me troue le..... 8O
Freak il explique que cette API est tres dangereuse, car elle ajoute l'antislash apres, certe...meme si y'a pas la place :?
Elle ecrase donc ce qui est a la suite....meme si c'est super important, comme la declaration des droits de l'homme par exemple :x
Il dit aussi, enfin de ce que j'ai compris, que la panne ne se passe pas souvent car y'a toujour une petite marge qui est crée d'office, mais que ça peut arriver

Alors mon cri de haine est :
Comment CROCRO peut se permettre de creer un API sur laquelle on a pas la main et qui peut au hasard ecraser la mémoire ??? :?
Si ça c'est pas un signe d'incompetence...a mon avis ça existe pas avec LINUX, ou alors avec protection

Donc boulot de ce matin, creer ma propre fonction qui rajoute le slash, sans ecraser les pingoinces de personne, c'est pas long me direz vous :?
Certes repondrais-je, mais ce qui va l'etre un peu plus, c'est de la remplacer de partout parmis mes 1000 fonctions de DLL :x

Nadine si meme les pros se mettent a faire des BUGS aleatoires...a quoi ça sert que je code mal moi ?? :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

si j'en crois la doc msn
LPTSTR PathAddBackslash(
__inout LPTSTR lpszPath
);

Parameters

lpszPath [in, out]

Type: LPTSTR

A pointer to a buffer with a string that represents a path. The size of this buffer must be set to MAX_PATH to ensure that it is large enough to hold the returned string.
cette Api permet bien de faire ce que tu dis , a partir d'un pointeur de chaine$

bon ...au vu du probleme que tu souleve, alors rajoute juste un espace a ta chaine pis voila :)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: GetLastName(FullDirectory.s)

Message par Ar-S »

Le Soldat Inconnu a écrit :En plus simple :mrgreen: Bon d'accord, je ne vérifie pas la validité du chemin

Code : Tout sélectionner

Procedure.s GetLastName(FullDirectory.s)
	If Right(FullDirectory, 1) = "\"
		FullDirectory = Left(FullDirectory, Len(FullDirectory) - 1)
	EndIf
	FullDirectory = GetFilePart(FullDirectory)
	ProcedureReturn FullDirectory
	
EndProcedure
Bordel, je fais du PB depuis 6 ans et je découvre que GetFilePart() marche aussi pour les chemin$ "dossiers"...
Pourquoi ? à cause du nom (comportant file) de la fonction et du pauvre exemple de la doc.
Ce genre de truc me met vraiment les boules... :?

1er code modifié...
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

Dobro a écrit :cette Api permet bien de faire ce que tu dis , a partir d'un pointeur de chaine$
bon ...au vu du probleme que tu souleve, alors rajoute juste un espace a ta chaine pis voila :)
Tu pense bien que j'y ai pensé foireux comme je suis :mrgreen: ...mais on recule le probleme d'un caratere :lol:

Code : Tout sélectionner

a$ = "c:\Kcc "
PathAddBackslash_(a$)
Debug a$
c:\Kcc \
Foutu que j'te dis foutu... :?
http://www.purebasic.fr/english/viewtop ... 77#p228877

Remarque en y pensant un peu plus, c'est vrai ce n'est pas window qui gere la table d'allocation des variables de ton programme, c'est ton programme lui meme...et il en va de meme pour la table de ta DLL..enfin je pense :roll:
Donc comment il pourrait savoir quelle place lui est alloué..y'a bien le chr(0) de fin, mais bon...

Donc c'est un peu le meme probleme que j'ai eu avec mes passages de pointeurs entre DLL, si tu envoie l'adresse du pointeur, rien ne t'empeches de le copier pour le lire...
Mais ACHTUNG !!! (Ca c'est pour SPH et avant qu'il me le demande "CH" se prononce "AR" :mrgreen:), si tu ecris plus long que ce que ton programme lui a alloué, tu ecrases surement "queque" chose, et en l'occurance surement le chr(0)

Et c'est comme ça, que je me suis retrouvé avec 1 mois de boulot pour comprendre le fonctionnement des pointeurs de variables et surtout essayer d'apprendre comment passer des tableaux, structure, et tout le toutim de PB a VB6, avec le bonheur comme si c'etait pas assez compliqué comme ça des SafeArray qui transmettent des pointeurs de pointeurs, et les BSTR qui contiennent la longueur de la string dans l'entete 8O merci CROCRO :?
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: GetLastName(FullDirectory.s)

Message par Le Soldat Inconnu »

KCC, tu n'as qu'a le coder en PB

Code : Tout sélectionner

If Right(Dossier, 1) <> "\"
  Dossier + "\"
EndIf
Et voilà :mrgreen: Pas de bug crosoft possible
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 10:37, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

Le Soldat Inconnu a écrit :KCC, tu n'as qu'a le coder en PB

Code : Tout sélectionner

If Right(Dossier, 1) <> "\"
  Dossier + "\"
EndIf
Et voilà :mrgreen: Pas de bug crosoft possible
Voui voui..c'est ce que j'ai fait, mais bon c'est quand meme dingue de créer un API aussi dangereuse.. 8O
J'ai l'impression que y'a que moi que ça affole :lol:
Il pourrait faire attention, y'a des inhibés du bulbes qui les utilisent ces fonctions :mrgreen:

Moi jusqu'a présent j'etait toujours "HAPPY" de trouver une telle "API" :D

L'avantage quand même c'est que comme elle etait dans "VINDOWS" bah ça gagne quelques lignes de codes... :roll:
Et puis quand on sait que ça existe pourquoi essayer de tout recreer ???
Enfin c'est une question de point de vue ..

Mais enfin c'est quand meme dingue non ??

@DOBRO
Y'a plein de truc qui m'interloque..si je peux regarder dans le mega copyright :lol:

Deja je crois que mid (Path$,1,1) = Left(Path$,1)
Et aussi Path$= "\" +Path$ ==> Path$+ "\"
c'est plus lisible..on est pas obligé de faire des lignes a ralonge comme CROCRO :lol:

Ca c'est quedal...mais pourquoi reverser...si ce n'est pour les impots...je comprend pas pourquoi ??? :mrgreen:

Et "Aut'chose" plus "techenique"...
Okay tu recuperes le pointeur tu copies son adresse dans un long MEM
Mais resoud tu le bleme de mémoire ??? si tu es dans une DLL qui a sa propre table d'allocation mémoire, comment peut elle savoir ce qu'a prevu ton programme qui lui envoie
Tu fait un POKES ça n'empeche pas que tu ecrase peut etre "queque" chose car c'est la DLL qui le fait..pas le programme

Je pense que ta soluce ne marche qu'en Include dans le code source de l'appli, pas avec un process exterieur...mais bon encore une fois, j'suis loin d'etre un expert :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: GetLastName(FullDirectory.s)

Message par Backup »

Kwai chang caine a écrit :
@DOBRO
Y'a plein de truc qui m'interloque..si je peux regarder dans le mega copyright :lol:


Et aussi Path$= "\" +Path$ ==> Path$+ "\"

c'est plus lisible..on est pas obligé de faire des lignes a ralonge comme CROCRO :lol:
j'ai deja répondu maintes fois a ça ! :)

c'est pas plus lisible, du tout meme !
tu te fie trop a Purebasic ! dans certain langage Basic le fait d'ecrire
Path$+ "\" ; signifie qu'a la variable path$ tu ajoute "\" , MAIS NE SIGNIFIE PAS que tu Altere la Variable Path$ !!

alors que la ligne :
Path$=Path$ +"\" ; signifie bien qu'au contenu de la variable Path$ on ajoute "\" , donc il y a Altération du contenu de la variable !

je sais qu'en Purebasic c'est optionel , mais question visibilité je prefere ma syntaxe , meme si elle est un poil plus longue

il peut y avoir confusion pour d'autres langage ou ecrire :

a+1 , n'as rien a voir avec : a=a+1 !!! ;)
d'ailleurs en C il existe le signe == pour faire la difference ...





Deja je crois que mid (Path$,1,1) = Left(Path$,1)
oui c'est pareil , et ça change rien :roll:
je te file une solution , j'ai jamais dis qu'elle etait optimisée .. :)
Ca c'est quedal...mais pourquoi reverser...si ce n'est pour les impots...je comprend pas pourquoi ??? :mrgreen:
simplement parce que cette soluce m'est venu plus simplement a la tete , le Basic permet plein de façon de faire différente
comme je te l'ai dis , j'ai pas cherché l'optimisation, mais juste que ça fonctionne ;)
Et "Aut'chose" plus "techenique"...
Okay tu recuperes le pointeur tu copies son adresse dans un long MEM
Mais resoud tu le bleme de mémoire ??? si tu es dans une DLL qui a sa propre table d'allocation mémoire, comment peut elle savoir ce qu'a prevu ton programme qui lui envoie
Tu fait un POKES ça n'empeche pas que tu ecrase peut etre "queque" chose car c'est la DLL qui le fait..pas le programme

Je pense que ta soluce ne marche qu'en Include dans le code source de l'appli, pas avec un process exterieur...mais bon encore une fois, j'suis loin d'etre un expert :oops:

je crois que tu te pose trop de question :roll:

si tu regarde bien ceci :

Code : Tout sélectionner

 if mid(Path$,1,1) <>"\"
        Path$="\"+Path$
        Path$=ReverseString(Path$)
        pokes(mem,path$)
    endif
je reforme une variable chaine Path$ en ajoutant le "\"

puis je poke CETTE variable a l'adresse de l'autre
du coup l'autre se trouve reformaté a la taille de ma nouvelle chaine !!

la preuve le Debug montre bien le changement , il n'y a pas de plantage ..
je suppose que le passage d'adresse de variable par procedure (donc par la pile)
gere le truc , sinon , on ne peut pas utiliser la commande Poke dans aucun langage !!

le ramasse miette doit faire son boulot ... (pour KCC : > http://fr.wikipedia.org/wiki/Ramasse-mi ... matique%29 )

Faudrai que Fred nous confirme ça !!!

ps: la fonction Poke contient le parametre longueur ; il est ecrit ans la Doc :
Note: quand le paramètre 'Options' est spécifié, la 'Longueur' peut être mise à -1, pour écrire toute la chaîne de caractère 'Texte$'.
donc c'est bien que Fred a prévu le coup ;)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

je crois que tu te pose trop de question
Et ben moi je crois que tu t'en pose pas assez :lol:

Tu n'as pas lu ce que je t'expliquais sur l'histoire de la gestion des variables par chacun des process de son coté
La mémoire est commune dans un EXE et sa DLL mais ils ont une table d'allocation differente, enfin de ce que m'a maintes fois expliqué SROD :oops:

Alors comme je te l'ai dit ta combine marche en include car c'est le meme process, mais en DLL....ça foire
J'ai poussé pour ecraser un max de truc en mémoire, et evidemment ça plante :D
Avec un seul slash t'as de la chance ça fonctione commepour l'API qui ecrase le chr(0), mais avec 5000 caracteres....y'a pas assez de chr(0) dans la mémoire :mrgreen:
le ramasse miette doit faire son boulot ...
Parcequ'avec ce code ci dessous, c'est plus un ramasse-miette qu'il faut..mais un ramasse baguette de pain :lol:
donc c'est bien que Fred a prévu le coup
FRED a tout prévu c'est vrai...sauf ma naissance :mrgreen:
Et jamais il aurait pu penser qu'une burne comme moi, utilise le pointeur d'un process pour l'ecraser avec un autre process en 10 fois plus long 8O
Remarque SROD non plus...la premiere fois qu'il m'a vu faire ce genre de chose..il etait mort de rire :oops:

Essaye tu va m'en dire des nouvelles

L'exe

Code : Tout sélectionner

If OpenLibrary(0, "DllAjoutNoirDeSlash.dll")
 a$ = "c:\Kcc"
 CallFunction(0, "PathAddBackslash", @a$)
 Debug a$
 b$ = "c:\Kcc"
 CallFunction(0, "PathAddNoirDeBackslash", @b$)
 Debug b$
 CloseLibrary(0)
EndIf 
La DLL

Code : Tout sélectionner

ProcedureDLL PathAddBackslash(Path)
 
 ;Solution By Dobro patented copyrighté Supra Hadopi : o) 
  ; ajoute un "\" si pas present a la fin 
 mem=Path
 path$= ReverseString ( PeekS (mem))
 
 If Mid (Path$,1,1) <> "\" 
  Path$= "\" +Path$
  Path$= ReverseString (Path$)
  PokeS(mem,path$)
 EndIf
 
EndProcedure

ProcedureDLL PathAddNoirDeBackslash(Path)
 
 ;Solution By Dobro patented copyrighté Supra Hadopi : o) 
  ; ajoute un "\" si pas present a la fin 
 mem=Path
 path$= ReverseString ( PeekS (mem))
 
 If Mid (Path$,1,1) <> "\" 
  Path$= RSet("", 5000, "\") +Path$
  Path$= ReverseString (Path$)
  PokeS(mem,path$)
 EndIf
 
EndProcedure
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: GetLastName(FullDirectory.s)

Message par Le Soldat Inconnu »

Dobro : Pfiou, t'as rien trouvé de plus compliqué ? :mrgreen:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: GetLastName(FullDirectory.s)

Message par Kwai chang caine »

SOLDAT :D
Dizi à DOBRO que KCC il a raison :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre