Nom de fichier valide

Nom de fichier valide - C - Programmation

Marsh Posté le 24-07-2006 à 00:29:25    

Yop,
 
Je cherche un moyen de savoir si un nom de fichier saisi dans une zone de texte est valide ou non.
 
J'ai essayé différentes méthodes, dont celle consistant à créer un "path" composé du répertoire et du nom de fichier et de faire un fopen dessus pour voir si le fichier est créé ou non. Mais me suis rendu compte que si on saisissait "..\test" en nom de fichier, ben ça passe et le fichier est créé dans le dossier parent :D  
 
Un autre truc auquel j'ai pensé, c'est filtrer directement la saisie clavier en interceptant les messages de l'api pour voir quelles sont les touches pressées. Et si la touche fait partie des caractères interdits et bien on stop l'envoi du message. Je sais faire ça sous Delphi et ça marche bien mais en C/Win32 je sèche.
 
Des idées ?

Reply

Marsh Posté le 24-07-2006 à 00:29:25   

Reply

Marsh Posté le 24-07-2006 à 00:42:25    

Inekman a écrit :

Je cherche un moyen de savoir si un nom de fichier saisi dans une zone de texte est valide ou non.


Ben ça dépend du système, pas du C...  
 
Une fois que les regles sont claires, il suffit de les appliquer...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-07-2006 à 00:48:29    

Système Win32, il me semblait l'avoir dit dans le post ^^
 
Sinon j'ai fait ceci :
 

Code :
  1. if (strspn("\"*/:<>?\\|", app.nomdest) == 0)
  2.    ok
  3. else
  4.    pas ok


J'ai regardé dans windows la liste des caractères qu'il interdit et je les ai mis dans la chaîne.
 
Qu'en penses-tu
 
[EDIT] : j'en pense que ça marche pas :( Je vais essayer de faire une succession de strchr sur chaque caractère.

Message cité 1 fois
Message édité par Inekman le 24-07-2006 à 01:00:00
Reply

Marsh Posté le 24-07-2006 à 01:19:21    

Voilà la fonction que j'ai codé pour ceux qui galèrent comme moi :

Code :
  1. int checkfilename(char *s)
  2. {
  3. if (strchr(s, '\"') != NULL)
  4.  return 0;
  5. else if (strchr(s, '*') != NULL)
  6.   return 0;
  7. else if (strchr(s, '/') != NULL)
  8.   return 0;
  9. else if (strchr(s, ':') != NULL)
  10.   return 0;
  11. else if (strchr(s, '<') != NULL)
  12.   return 0;
  13. else if (strchr(s, '>') != NULL)
  14.   return 0;
  15. else if (strchr(s, '?') != NULL)
  16.   return 0;
  17. else if (strchr(s, '\\') != NULL)
  18.   return 0;
  19. else if (strchr(s, '|') != NULL)
  20.   return 0;
  21. else return 1;
  22. }


 
Ca marche bien jusqu'à preuve du contraire.

Reply

Marsh Posté le 24-07-2006 à 08:39:10    

Inekman a écrit :

Yop,
 
Je cherche un moyen de savoir si un nom de fichier saisi dans une zone de texte est valide ou non.
 
J'ai essayé différentes méthodes, dont celle consistant à créer un "path" composé du répertoire et du nom de fichier et de faire un fopen dessus pour voir si le fichier est créé ou non. Mais me suis rendu compte que si on saisissait "..\test" en nom de fichier, ben ça passe et le fichier est créé dans le dossier parent :D  
 
Un autre truc auquel j'ai pensé, c'est filtrer directement la saisie clavier en interceptant les messages de l'api pour voir quelles sont les touches pressées. Et si la touche fait partie des caractères interdits et bien on stop l'envoi du message. Je sais faire ça sous Delphi et ça marche bien mais en C/Win32 je sèche.
 
Des idées ?


 
Regarde du cote des fonctions access() ou stat() (enfin ca a la base c'est plutot un syscall sous unix) ca t'evitera de te faire chier a coup de verification dans ta textbox, parce qu'au moins ca ne creera pas le fichier s'il existe pas (cela dit c'est une option de fopen ca aussi, je me souviens plus parce que j'utilise qu'open() sous unix, mais je dirais que le "+" que tu passes en parametre dit a fopen que si le fichier existe pas, il le cree.)
 
bref teste un truc genre if (stat(tonfilenamedanstatextbox, &tastructurestatjusteaudessus)) {blablapasdefichier}
 
MeiK

Reply

Marsh Posté le 24-07-2006 à 09:23:39    

Inekman a écrit :

Système Win32

Code :
  1. if (strspn("\"*/:<>?\\|", app.nomdest) == 0)




strpbrk() plutôt, non ? '/' et '\\' ne sont pas des caractères interdits... Ce sont les séparateurs de chemin ! Quand à ", il sert à entourer un nom de fichier qui aurait des espaces... Le ':' est le séparateur pour les lettres...  
 
Il y a aussi un aspect séquenciel. Un '/' ou un '\\' ne peut apparaitre que si il n'y a pas eu de '.' avant
 
Idem pour "//" et "\\\" (// = séparateur de nom de machine en réseau) qui ne peut apparaitre que si il n'y a eu ni '/', ni '\\' ni '.'...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-07-2006 à 09:59:21    

meik a écrit :

Regarde du cote des fonctions access() ou stat()


Je vais rechercher de ce côté, merci.
 

Emmanuel Delahaye a écrit :

strpbrk() plutôt, non ? '/' et '\\' ne sont pas des caractères interdits... Ce sont les séparateurs de chemin ! Quand à ", il sert à entourer un nom de fichier qui aurait des espaces... Le ':' est le séparateur pour les lettres...  
 
Il y a aussi un aspect séquenciel. Un '/' ou un '\\' ne peut apparaitre que si il n'y a pas eu de '.' avant
 
Idem pour "//" et "\\\" (// = séparateur de nom de machine en réseau) qui ne peut apparaitre que si il n'y a eu ni '/', ni '\\' ni '.'...


En fait, il y a une zone de texte pour le répertoire et une autre pour le fichier à créer et c'est uniquement pour ce dernier que je souhaite gérer ces caractères.

Reply

Marsh Posté le 24-07-2006 à 10:04:24    

Inekman a écrit :

Je vais rechercher de ce côté, merci.
 
 
En fait, il y a une zone de texte pour le répertoire et une autre pour le fichier à créer et c'est uniquement pour ce dernier que je souhaite gérer ces caractères.


OK. Y'a pas déjà des boites toutes faites pour ce genre de choses ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-07-2006 à 10:20:41    

Pour les répertoires j'utilise la fonction "SHBrowseForFolder()" à laquelle je transmet une structure "BROWSEINFO" qui contient les informations du dossier sélectionné. En ce qui concerne le nom du fichier, y'a GetSaveFileName je crois mais il faut que je modifie mon code pour gérer ça car à mon avis cette boîte retourne tout le chemin alors que moi je traite le dossier d'une part et le fichier d'autre part et je concatène les deux par la suite (ce qui revient au même ^^) mais il faut que j'ai ces 2 informations séparément car je fais d'autres usages dans la suite du programme


Message édité par Inekman le 24-07-2006 à 10:21:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed