Renommer un fichier en java sans un "?"
Résolu/Ferméazerty_qwerty Messages postés 61 Date d'inscription vendredi 23 mars 2018 Statut Membre Dernière intervention 6 décembre 2022 - 24 nov. 2022 à 15:55
- Renommer un fichier en java sans un "?"
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Waptrick java football - Télécharger - Jeux vidéo
- Fichier rar - Guide
- Renommer plusieurs fichiers en même temps - Guide
6 réponses
18 nov. 2022 à 08:11
Bonjour,
replaceAll prends en paramètre une regex, or le ? est un caractère spécial pour les expressions régulières.
Soit tu utilises plutôt la méthode replace qui prends en paramètre un String, dans ce cas tu peux mettre "?" en paramètre. Soit tu continues avec replaceAll mais il faut alors échapper le ? avec un \ dans la regex (qui lui même doit être échappé par un autre \ dans le String)
nomNouveau = nomAncien.replace("?", ""); nomNouveau = nomAncien.replaceAll("\\?", "");
18 nov. 2022 à 08:20
Bonjour,
Je ne comprends rien à Java, je commente la question par une autre question: le point d'interrogation est un caractère interdit dans le nom des fichiers Windows, ce qui expliquerait le comportement sauf s'il s'agit de Linux/Unix?
Dans ce dernier cas de figure, il existe de nombreuses solutions simples par exemple via bash.
18 nov. 2022 à 16:54
18 nov. 2022 à 17:30
Bonjour,
Il ne faut pas échapper le \ donc essaie ceci :
nomNouveau = nomAncien.replaceAll("\?", "");
18 nov. 2022 à 17:32
Si il faut échapper le ? par un \ dans la regex, et en plus échapper le \ dans une String.
On se retrouve avec deux \ dans le code c'est normal.
Modifié le 18 nov. 2022 à 18:07
Bonjour KX,
Je dois avouer ne pas comprendre "et en plus échapper le \ dans une String" et ne pas connaitre java, mais en javascript j'obtiens cela :
<script> nomAncien="fff?gg??g"; nomNouveau = nomAncien.replaceAll("\\?", ""); console.log(nomAncien,nomNouveau); //fff?gg??g fff?gg??g nomNouveau = nomAncien.replaceAll("\?", ""); console.log(nomAncien,nomNouveau); //fff?gg??g fffggg </script>
18 nov. 2022 à 18:27
JavaScript ce n'est pas Java, ce sont deux langages différents avec des syntaxes différentes et même si certaines méthodes ont le même nom elles ne font pas forcément exactement la même chose.
En Java : si je veux afficher Bonjour je dois écrire :
System.out.println("Bonjour");
Si je veux par exemple faire une tabulation, ou un saut de ligne, je peux utiliser les caractères \t ou \n qui sont écrits avec une combinaison d'un \ et d'une lettre
System.out.println("Bonjour\nLa ligne");
Il peut y avoir des combinaisons plus compliqués, par exemple pour les caractères Unicode avec \u suivi du code hexadécimal du caractère.
Bref, le \ est un caractère d'échappement utilisé dans des combinaisons de caractère dans les String en Java et si on veut juste afficher le \ il faut utiliser la combinaison \\
System.out.println("Bonjour \\ le slash");
Ce qui affichera Bonjour \ le slash
Donc lorsque l'on écrit une regex avec un \ comme dans \? il faut l'échapper et écrire "\\?"
Remarque : dans les regex les \ aussi peuvent être échappés, donc si dans la regex on veut juste le caractère \ il faut l'échapper \\ ce qui dans un String donne "\\\\" avec 4 \
18 nov. 2022 à 18:49
OK, merci pour tes explications.
20 nov. 2022 à 22:47
Je reviens vers vous car j'ai un autre souci. Je pense que cela est du au "?" qui doit avoir une action.
Dans mon dossier, je vous ai dit que j'ai des fichiers nommé par des "?"
exemple : bou? etrange? 2323232.txt
Le code ne fonctionnait plus car "contains" ne retrouvait pas de ? Etrange, puisque je les vois dans mon dossier ces fameux "?".
J'ai donc récupéré le nom grâce à System.out.println(file.getName()) pour essayer de comprendre et voici ce que je trouve
bou
etrange
2323232.txt
Comme ci le "?" provoque un retour à la ligne.
Et donc finalement, mes fichiers ne peuvent etre renommés sans "?"
Pour quelle raison ? Et quelle est la solution ?
21 nov. 2022 à 13:36
Bonjour,
De toute évidence ton "?" n'est pas un point d'interrogation, c'est sûrement un affichage par défaut d'un caractère non affichable.
Pour déboguer, tu pourrais afficher le nom de chacun des caractères de tes fichiers.
for (File file : new File("/Users/bou/Stockage").listFiles()) { System.out.println(file.getAbsolutePath()); file.getName().chars().forEach(c -> System.out.printf("\t%c\t%d\t%x\t%s%n", c, c, c, Character.getName(c)) ); }
Exemple (sous Windows), avec le caractère, le code décimal, le code hexadécimal et le nom Unicode.
C:\Program Files (x86)
P 80 50 LATIN CAPITAL LETTER P
r 114 72 LATIN SMALL LETTER R
o 111 6f LATIN SMALL LETTER O
g 103 67 LATIN SMALL LETTER G
r 114 72 LATIN SMALL LETTER R
a 97 61 LATIN SMALL LETTER A
m 109 6d LATIN SMALL LETTER M
32 20 SPACE
F 70 46 LATIN CAPITAL LETTER F
i 105 69 LATIN SMALL LETTER I
l 108 6c LATIN SMALL LETTER L
e 101 65 LATIN SMALL LETTER E
s 115 73 LATIN SMALL LETTER S
32 20 SPACE
( 40 28 LEFT PARENTHESIS
x 120 78 LATIN SMALL LETTER X
8 56 38 DIGIT EIGHT
6 54 36 DIGIT SIX
) 41 29 RIGHT PARENTHESIS
Avec ça on devrait identifier le caractère problématique. Imaginons que ce soit par exemple � dont le code hexadécimal est fffd dans ce cas tu peux faire :
replace("\ufffd", "")
21 nov. 2022 à 14:50
Génial !
Je pense que le "?" correspond à cela
13 d CARRIAGE RETURN (CR)
21 nov. 2022 à 18:07
J'ai vu le code hexdecimal 0D
https://www.eso.org/~ndelmott/ascii.html
21 nov. 2022 à 18:19
Du coup tu peux faire :
replace("\u000d", "")
Ou plus simplement :
replace("\r", "")
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question21 nov. 2022 à 23:29
tjrs rien.
ne faudrait-il pas modifier file.getName().contains("?") car finalement ce ? n'est pas une ponctuation ?
22 nov. 2022 à 00:02
En fait voici le code qui fonctionne ci-dessous. J'ai retiré contains car il ne reconnait pas le "?"
public class RenameFilesJava { public static void main(String[] args) { for (File file : new File("/Users/bou/Stockage").listFiles()) { File renameFile = new File(file.getParentFile(), file.getName().replace("\r", "")); boolean result = file.renameTo(renameFile); System.out.println(file + " => " + renameFile + " => " + (result ? "OK" : "KO")); } } }
22 nov. 2022 à 00:02
D'ailleurs, comment contains pourrait reconnaitre ce carriage return ?
Modifié le 22 nov. 2022 à 07:44
Il faut juste remplacer ? par \r partout, donc :
if (file.getName().contains("?")) { ... file.getName().replace("?", "") }
if (file.getName().contains("\r")) { ... file.getName().replace("\r", "") }
24 nov. 2022 à 15:55
Super ! merci pour les conseils et votre aide.
18 nov. 2022 à 15:36
Bonjour,
Je suis sur MAc.
cela ne fonctionne tjrs pas et je ne comprends pas
18 nov. 2022 à 17:33
Ces deux lignes fonctionnent bien. Mais une seule suffira, elles font la même chose.
Exemple :
18 nov. 2022 à 17:43
Code complet pour faire le renommage de tous les fichiers dans ton répertoire :
19 nov. 2022 à 11:30
Nickel ! Le code fonctionne parfaitement. Merci KX.