La détermination du nom d'un fichier copié dans son répertoire d'origine

Lorsque l’on place une copie d’un fichier dans le répertoire de ce fichier d’origine, l’explorateur windows renomme ce fichier en “Copie de…”.
Si on le copie encore dans le même répertoire, il va s’appeller "Copie (2) de…"
On pourrait établir des rêgles de transformations, mais l’appli que je développe et qui doit reproduire ce comportement est multi-langues et ses rêgles seraient donc différentes pour chaque langue. Difficile donc je suppose de faire un traitement différent pour chaque langue, étant données les différentes possibilités syntaxiques.

Ma question est : comment l’explorateur détermine-t-il le nouveau nom de la copie ?
Existe-t-il une API qui puisse le déterminer ? (je développe en windev, je n’ai pas beaucoup d’autres solutions que les API)

Tu ne peux pas tout simplement vérifier l’existance d’un fichier en Windev ?

Imaginons que tu veuille copier toto.doc dans le même repertoire ou il se trouve.
Tu regarde donc avant de créer ton nouveau fichier si “toto.doc” existe pour cette destination…

Mince alors… tu testes donc ensuite un truc du genre “Copie de toto.doc” (pour les langues multiples, tu peux gerer ca avec un tableau de prefixe j’image… et donc avoir des noms de la forme [prefixe][fichier])

Si ce fichier la aussi existe, alors tu testes avec [prefixe](i)[fichier], avec i=1.
Et si il existe aussi, i=2, etc…

Au final, une fois que tu as trouvé que le nom que tu veux utiliser n’existe pas, il ne te reste plus qu’a créer ton nouveau fichier (copier les données de l’autre)

Je pense que c’est aussi simple que ça…ou bien je me goure !

(merci pour ta réponse)

Si si tout à fait. C’est ce j’appellais des rêgles de transformations. Le problème est que rien ne me dit que ces rêgles sont appliquables dans toutes les langues. En français, on met “Copie de” devant, mais j’imagine que dans d’autres langues, genre l’allemand (je dis allemand mais je n’en sais rien), la syntaxe sera un truc du genre “Nom du fichier”+achtunggrunkelchoucroute; en bref la rêgle du “j’ajoute telle chaine devant le fichier” (avec incrémentation du nombre de copies “(X)”) ne serait pas forcément valable dans toutes les langues

si dans ton tableau tu rajoutes une donnée qui te donne si c’est un prefixe/suffixe, c’est pas bon? Ca te ferais une table de correspondance du genre :

langue | libellé | indicateur prefixe/suffixe

En effet c’est une possibilité, mais qui m’oblige à gérer les langues au cas par cas.

Ce serait super pratique s’il y avait une API du genre “GetFileCopyName” capable de te générer le nom en fonction du langage de windows et de la présence éventuelle d’un fichier homonyme.

5 minutes sur MSDN. Ou pour une bonne rigolade (de gros geek) mattes aussi cette fonction (genial le nom). Effectivement, inutile de reinventer la roue (mal). Et effectivement c’est loin d’etre aussi trivial que ca puisse paraitre. La totalle. Ne pas oublier le toujours tres utile SHPreparePathForWrite qui fait une tonne de trucs pour toi dans plein de cas auquels tu as peut etre pas pense

C’est que la premiere que j’ai trouve a priori, il y en a ptet d’autres.

Tout ca c’est des fonctionalites de l’API du shell puisque c’est de ca qu’il s’agit Etonnament il y a plein plein de fonctions et de trucs super pratiques. Parceque bien sur non seulement il y a des regles de langues toutes plus farfelues les unes que les autres mais aussi des regles dependantes du support sur lequel tu travaille “fichiers longs” supportes ou pas, etc, etc

Have fun.
Ce message a été édité par GloP le 16/10/2004

Merci beaucoup, mais ces fonctions necessitent shell32 5.0 minimum, et j’aimerais que mon appli fonctionne sous windows 98

Hmmm, avec des regular expressions stockées dans le tableau de langues? Ou un simple
"Copie #number# de #file#.#extension#" FR
"Copy #number# of #file#.#extension#" EN
"#number# pizza #file# mozzarella.#extension#" IT
"Ach zo #file# ist #number# van.#extension#" DE
"Het #number# met #file#.#extension#" NL
 
et un coups de replace des markeurs dans la chaine, pour faire vraiment simple
 
Ca semble appliquable a toutes le langues,non?

 

Si si, c’est déjà ce que suggérait Griim, mais comme l’a confirmé Glop, ce n’est pas une bonne solution.

Excuse moi mais c’est quoi le but, exactement ?
Te prendre pour l’explorateur et générer des “copie (N) de”, pour faire comme si c’était l’explorateur qui l’avait créé ?
Ou bien créer des fichiers avec un nom unique ? (si oui, s’agit-il de fichiers temporaire qu’on pourait foutre dans Temp ? parceque j’ai vu une fonction “createTempFileName” ou un truc du genre qui existerait dans 98)

Dans le premier cas, à mon avis, la solution se trouve dans une chaine dans shell.dll (en 98), shell32.dll (2000 et +), ou bien encore explorer.exe, mais je ne sais pas les extraire par un programme (mais je sais que cela est faisable, et je sais qu’il existe une version différente d’explorer.exe par langue).

(Le but est de développer un explorateur windows shareware)

ppfff rien à faire, j’ai beau retourner msdn dans tous les sens, polluer tous les sites d’api, rien n’y fait; pas moyen de trouver la solution pour windows 98…

help please