Renommer plusieurs fichiers en même temps [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 16 avril 2017 à 15:48 - Dernière réponse : Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

23 réponses

vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention - 16 avril 2017 à 19:04
0
Merci
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

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention - 18 avril 2017 à 19:57
Bonjour vb95,
merci pour la note
je ne veux pas exagérer j'ai une dernière question, on va revenir au problème pour moi plutôt si je veux renommer une partie des fichiers d'un dossier
Par exemple j'ai dans un dossier les fichiers suivants (remarque : tous les fichiers sont du même type ) :
Im 1
Im 2
Im 3
Im 6
Fich2
Fich3
Fich2_2
Fich2_3
Fich2_4

Je veux renommer les fichier Suivants : "Im 1", "Im 2", "Im 3", "Im 6", "Fich2_4" avec un nom "Fich" plus un indice, alors :
Le nouveau nom de Im 1 sera Fich1
Normalement le nouveau nom de Im 2 sera Fich2 mais il existe déjà, alors je passe à l'indice suivant "3" (Fich3), même ce nom existe, alors je passe encore une fois à l'indice suivant "4", celui là n'existe pas
alors le nouveau nom de Im 2 sera Fich4
Fich5 n'existe pas, alors le nouveau nom de Im 3 sera Fich5
ainsi de suite
la même méthode utilisé pour créer un dossier dans Windows
Si on a dans un dossier plusieurs dossiers :
Nouveau dossier
Nouveau dossier (2)
Nouveau dossier (5)
Nouveau dossier (6)
Nouveau dossier (8)
quand on crée un nouveau dossier il ne choisit pas le nom "Nouveau dossier" ni le nom "Nouveau dossier (2)" car il existe déjà le nouveau nom sera "Nouveau dossier (3)"
Aprés "Nouveau dossier (4)"
Aprés "Nouveau dossier (7)"
Aprés "Nouveau dossier (9)"
Aprés "Nouveau dossier (10)"
est-ce que c'est possible de faire ça ?
vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 18 avril 2017 à 22:02
Bonsoir
C'est faisable
Réfléchissons en pseudo-code

dim Indice as Integer = 0 ' indice pour les fichiers
dim NouveauNom as String = "Nouveau"
for i = 0 to NombreFichiers - 1
Do
Dim NouveauFichier as String = NouveauNom & Indice.toString
If NouveauFichier Existepas Then Exit Do
Indice = Indice + 1
Loop
' Renommer le fichier avec NouveauNom & Indice.Tostring
Indice = Indice + 1
next



Tu remarqueras plusieurs choses
1) ce n'est plus i qui sert d'indice pour le nom de fichier
2) La fonction ExistePas teste si le fichier n'existe pas dans ce répertoire . Attention le fonction File.Exists demande le nom complet du fichier (chemin, nom et extension)
3) La boucle Do Loop boucle sur elle-même si le fichier Nouveau3 existe par exemple . Alors on essaie Nouveau4 . Si il existe on reboucle pour Nouveau5 et ainsi de suite
Si le fichier n'existe pas on sort de la boucle Do Loop et le fichier prendra le nom Nouveau & Indice.ToString
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention - 20 avril 2017 à 20:10
Salut vb95
désolé de ne pas t'avoir répondu plus tôt ces derniers jours j'ai un problème avec ma connexion internet
ce code marche comme je veux
merci pour ton aide
vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 20 avril 2017 à 21:24
Aucun souci Karon.code
Si tout est ok n'oublie pas le bouton "Marqué comme Résolu"
Au plaisir de t'aider et bonne fin de semaine
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1669 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention - 20 avril 2017 à 22:02
oups j'ai oublié merci de m'avoir rappeler
Commenter la réponse de vb95
cs_Le Pivert 5364 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 24 septembre 2018 Dernière intervention - 18 avril 2017 à 11:38
0
Merci
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à
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 18 avril 2017 à 19:51
Bonjour cs_Le Privert,
Merci
je vais jeter un œil tout de suite à ces deux projets
Commenter la réponse de cs_Le Pivert
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 20 avril 2017 à 20:11
0
Merci
merci à vb95, Whismeril et cs_Le Pivert pour votre aide sur ce sujet
Commenter la réponse de Karin.code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.