Renommer plusieurs fichiers en même temps

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 16 avril 2017 à 15:48
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - 20 avril 2017 à 22:02
Bonjour tout le monde,
comme le nom l'indique cette application sert à renommer plusieurs fichiers en même temps
En cliquant sur le bouton 1 j'apporte dans la Listview qui contient Trois colonnes le nom, l'extension et le chemin d'accès du fichier
Privat Chemin_Dossier as String
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Dossier As New FolderBrowserDialog
If Dossier.ShowDialog = Windows.Forms.DialogResult.OK Then
Chemin_Dossier = Dossier.SelectedPath
For Each Fichier As String In IO.Directory.GetFiles(Chemin_Dossier)
Dim info As New IO.FileInfo(Fichier)
ListViewFichier.Items.Add(New ListViewItem({info.Name.Replace(info.Name.Substring(info.Name.LastIndexOf(".")), "").Replace(info.Name.Substring(info.Name.LastIndexOf(".")), ""), info.Extension.Replace(".", ""), Fichier}))
Next
End If
End Sub


En cliquant sur le bouton 2 tous les fichiers qui sont contenu dans la listview seront renommer de haut vers le bas de la liste
Privat Nouveau_Nom as String = "Im" 'Par exemple
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For i As Integer = 0 To ListViewFichier.Items.Count - 1
My.Computer.FileSystem.RenameFile(ListViewFichier.Items(i).SubItems(2).Text, Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
Next
End Sub

jusqu'à la tout fonctionne
j'ai remarqué que si un fichier à même Nom que le Nouveau Nom une erreur s'affiche (c'est plutôt logique car deux fichiers qui sont du même type, qui ont le même Nom et il sont dans le même dossier n'existe pas)
tout d'abord j'ai pensé à cette méthode
Privat Nouveau_Nom as String = "Im" 'Par exemple
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For i As Integer = 0 To ListViewFichier.Items.Count - 1
If IO.File.Exists(ListViewFichier.Items(i).SubItems(2).Text) Then
If IO.File.Exists(IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) Then
My.Computer.FileSystem.RenameFile((IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text), Nouveau_Nom & "_1." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
For j As Integer = 0 To ListViewFichier.Items.Count - 1
If ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text Then
ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "_1." & ListViewFichier.Items(i).SubItems(1).Text
ListViewFichier.Items(j).SubItems(0).Text = Nouveau_Nom & i & "_1"
Exit For
End If
Next
End If
My.Computer.FileSystem.RenameFile(ListViewFichier.Items(i).SubItems(2).Text, Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
End If
Next
End Sub

si le nom du fichier qui va être renommer existe déjà alors on ajoute "_1" à ce nom qui existe avant de continuer le renommage des fichiers
Privat Nouveau_Nom as String = "Im" 'Par exemple
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For i As Integer = 0 To ListViewFichier.Items.Count - 1
If IO.File.Exists(ListViewFichier.Items(i).SubItems(2).Text) Then
If IO.File.Exists(IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) Then
My.Computer.FileSystem.RenameFile((IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text), Nouveau_Nom & i & "_1." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
For j As Integer = 0 To ListViewFichier.Items.Count - 1
If ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text Then
ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "_1." & ListViewFichier.Items(i).SubItems(1).Text
ListViewFichier.Items(j).SubItems(0).Text = Nouveau_Nom & i & "_1"
Exit For
End If
Next
End If
My.Computer.FileSystem.RenameFile(ListViewFichier.Items(i).SubItems(2).Text, Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
End If
Next
End Sub

c'est vrai que l'erreur est évité mais le fichier avec le nom +"_1" ne sera pas renommer comme les autres fichier par exemple :
im 1, im 2, im 3, im 3_1 ,im 4 ...ect
normalement :
im 1, im 2, im 3, im 4 ,im 5 ...ect
j'ai aussi pensé à ça Mais sans succès
Privat Nouveau_Nom as String = "Im" 'Par exemple
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
For i As Integer = 0 To ListViewFichier.Items.Count - 1
If IO.File.Exists(ListViewFichier.Items(i).SubItems(2).Text) Then
For j As Integer = 0 To ListViewFichier.Items.Count - 1
If ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text Then
My.Computer.FileSystem.RenameFile(ListViewFichier.Items(j).SubItems(2).Text, Nouveau_Nom & i & "_1." & ListViewFichier.Items(j).SubItems(1).Text) ' Renomme le fichier
ListViewFichier.Items(j).SubItems(2).Text = IO.Path.GetDirectoryName(ListViewFichier.Items(i).SubItems(2).Text) & "\" & Nouveau_Nom & i & "_1." & ListViewFichier.Items(i).SubItems(1).Text
ListViewFichier.Items(j).SubItems(0).Text = Nouveau_Nom & i & "_1"
Exit For
End If
Next
My.Computer.FileSystem.RenameFile(ListViewFichier.Items(i).SubItems(2).Text, Nouveau_Nom & i & "." & ListViewFichier.Items(i).SubItems(1).Text) ' Renomme le fichier
End If

Next
End Sub

je demande votre aide pour m'éclairer sur l'erreur que j'ai fait
merci d'avance pour votre aide

3 réponses

vb95 Messages postés 3058 Date d'inscription samedi 11 janvier 2014 Statut Non membre Dernière intervention 27 septembre 2022 158
16 avril 2017 à 19:04
Bonjour Karin.code

La listview est là pour afficher des données ( pas pour faire des manipulations sur ces données)
Et ceci est valable pour tous les contrôles en cas de "traitement lourd" . Si ce traitement n'utilise qu'une ou 2 lignes de codes dans la procédure on peut le faire directement sur le contrôle lui-même
Dans ton cas tu as une liste de fichiers avec 3 informations
- le chemin de ce fichier
- le nom de ce fichier
- l'extension de ce fichier
Pourquoi ne pas créer une list(of Fichiers) avec une classe Fichiers et travailler avec .
Une fois les noms changés tu affiches de nouveau la Listview modifiée .


Private class Fichiers
Public Property Nom as String
Public Property Extension as string
Public Property Chemin as String
End Class


De plus la class System.IO.File a les méthodes nécessaires pour estraire ces 2 informations directement sans passer par des LastIndex(of) pour rechercher le nom, l'extension et le chemin d'un fichier

Maintenant pour ton problème n'est-il pas plus judicieux de tester avant le renommage des fichiers si un nom de fichier est déjà égal au nouveau nom que l'on veut donner à tous les fichiers .
si c'est le cas on avertit l'utilisateur pour qu'il choisisse un autre nom

0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
16 avril 2017 à 20:09
Salut vb95,
merci pour ta réponse
tout d'abord :
Pour la première remarque :
j'utilise la ListView pour afficher des informations sur le dossier le nombre, le nom,le type des fichiers et bien sûr leur chemin d’accès.
je l'utilise aussi pour changer l'ordre des fichiers avec un bouton "UP" et un bouton "Down" (pour préciser qui sera le 1er fichier a être renommer, le 2eme fichier, le 3eme fichier ainsi de suite )
Pour la deuxième remarque :
si c'est le cas ça sera beaucoup mieux que d'utiliser LastIndex(of) je vais faire des recherches
Pour la troisième remarque :
ce n'est pas ce que j'ai fait ?
si le nom existe déjà, le fichier sera renommer provisoirement et il gardera son ordre dans la liste après il sera renommer de la même façon que tous les autres fichiers
je ne sais pas si j'ai bien expliqué, je vais essayer de mieux expliquer la prochaine fois si ce n'est pas le cas
0
vb95 Messages postés 3058 Date d'inscription samedi 11 janvier 2014 Statut Non membre Dernière intervention 27 septembre 2022 158 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
Modifié le 16 avril 2017 à 21:24
Bonsoir Karin.code
Si j'ai bien compris tous les fichiers ont le même nom suivi d'un indice numérique : fichier1, fichier2, fichier3, etc.... une fois le renommage fait

Pour la première remarque dans Button2_Click tu utilises la listview pour aller chercher les noms, extensions et chemins des fichiers
Lorsque tu charges la listview tu crées la list(Of Fichiers) et ensuite tu travailles avec cette List(of ) au lieu de travailler avec les Items de la listview pour modifier les noms . Et en passant par System.IO tu as directement les 3 informations ( je me suis trompé ce n'est pas System.IO.File )
Une fois la modification faite tu recharges la listview

Pour le troisième point tu as raison mais il faut le faire en 2 étapes
1) tu vérifies en premier pour tous les fichiers si un fichier n'a pas le même nom que celui que tu veux donner . si c'est le cas tu lui changes le nom
2)Ensuite tu fais le changement de nom pour tous les fichiers

Autre chose : donne un nom ( propriété Name ) à tes boutons et autres contrôles car Button1 et Button2 ne sont guère parlants : RemplirListefichiers er Renommerfichier sont plus parlants

Petit détail : dans les 4 codes que tu as montré il manque un "e" au Private de la première ligne
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3058 Date d'inscription samedi 11 janvier 2014 Statut Non membre Dernière intervention 27 septembre 2022
17 avril 2017 à 15:40
Bonjour Vb95,
désolé je n'ai pas pu te répondre plus tôt
j'ai suivi tes conseils et tu avais raison, on ne peut pas vérifier et renommer en même temps ça risquerait de Créer des erreurs, il faut les séparer en deux états :
la première est de vérifier si les nouveaux noms existe ou non, si c'est le cas les fichiers avec le même non seront renommer
la deuxième est de renommer tous les fichiers sans aucune vérification

Autre chose : donne un nom ( propriété Name ) à tes boutons et autres contrôles car Button1 et Button2 ne sont guère parlants : RemplirListefichiers er Renommerfichier sont plus parlants

j'ai déjà renommer tous les contrôles dans le projet original, j'utilise un autre projet pour des essais

Petit détail : dans les 4 codes que tu as montré il manque un "e" au Private de la première ligne

en fait le projet était assez long et les déclarations "Private" il était assez loin par rapport à l’événement "Bouton.Click", alors j'ai écrit manuellement ces déclarations, j'ai dû oublier le "e", merci pour la remarque
0
vb95 Messages postés 3058 Date d'inscription samedi 11 janvier 2014 Statut Non membre Dernière intervention 27 septembre 2022 158 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
17 avril 2017 à 16:31
Bojour Karin.code

tu dis pour la première étape : la première étape est de vérifier si les nouveaux noms existent ou non, si c'est le cas les fichiers avec le même nom seront renommés
si tu renommes un fichier il faut refaire toute la vérification à nouveau pour ce fichier
Supposons
Tu veux renommer tes fichiers ainsi :Fich0, Fich1, Fich2, etc .....
Ton second fichier a le même nom qu'un fichier du renommage : Fich2
Tu le renommes Fich5
Deux cas peuvent se produire
- Le répertoire contient déjà un fichier Fich5
- Fich5 est un nom prévu pour le renommage
Donc lorsque tu renommes un fichier il faut vérifier qu'il n'existe pas déjà dans le répertoire et si ce nouveau nom n'est pas affecté à un nom de renommage .
C'est moins facile qu'il n'y paraît mais tous les cas sont à prendre en compte : cela peut marcher correctement pendant 2 mois et paf : un cas spécial comme les 2 cités plus haut et ça plante !
Va chercher le bug ensuite !!!!!!
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3058 Date d'inscription samedi 11 janvier 2014 Statut Non membre Dernière intervention 27 septembre 2022
17 avril 2017 à 20:21
Salut vb95,
c'est vrai dans ce cas c'est un problème mais quand j'ai dit renommer le fichier avec le même nom si il existe, ce n'est pas le renommer de Fich2 à Fich5 mais d'ajouter au nom un texte par exemple "_1"
mais maintenant que je l'écris je dit que même cette méthode pose problème parce-que si par exemple le Nom Fich2_1 existe déjà alors quand j'ajoute "_1" à Fich2 une erreur s'affiche qui dit que ce nom existe déjà
je vais suggérer une solution et dit moi si ça résout le problème ou non :
si je renomme tous les fichiers avec un nom spécial (impossible que quelqu'un pense à ce nom), par exemple "ExeRenoChanKarinCode", ça donnera ça :
ExeRenoChanKarinCode1, ExeRenoChanKarinCode2, ExeRenoChanKarinCode3 ..etc
après je renomme les fichiers avec le nom que j'ai choisi
ça sera une boucle après une boucle, personne ne sera que les fichiers étaient renommer avec au début avec le nom "ExeRenoChanKarinCode"
0
cs_Le Pivert Messages postés 7822 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 16 septembre 2022 133
18 avril 2017 à 11:38
Bonjour à tous,

Voici 2 exemples:

1er renomme avec un nom bidon (pour éviter le bug du même nom) et ensuite le bon nom
Très rapide

http://codes-sources.commentcamarche.net/source/52962-renommer-tous-les-fichiers-d-un-dossier-par-clic-droit

2ème renomme dans un nouveau dossier, beaucoup plus souple mais plus lent

http://codes-sources.commentcamarche.net/source/54479-assistant-photos

voilà
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
18 avril 2017 à 19:51
Bonjour cs_Le Privert,
Merci
je vais jeter un œil tout de suite à ces deux projets
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
20 avril 2017 à 20:11
merci à vb95, Whismeril et cs_Le Pivert pour votre aide sur ce sujet
0