[vb6] Traitement de fichiers en masse

Fermé
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 28 mars 2009 à 00:05
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 29 mars 2009 à 23:03
Bonjour, j'ai fait un programme qui renomme tous les fichiers d'un même dossier.

Dim Dossier As Object
Dim Fichiers As Object
Dim Longueur As Integer
Dim Fso As Object
Set Fso = CreateObject("Scripting.FileSystemObject")

If Fso.FolderExists(Path.Text) = False Then
Erreur
ElseIf IsNumeric(SupGauche) = False Then
Erreur
ElseIf SupGauche.Text < 0 Then
Erreur
ElseIf SupDroite.Text < 0 Then
Erreur
ElseIf IsNumeric(SupDroite) = False Then
Erreur
ElseIf AddGauche.Text = "Ajouter des caratères par la gauche ?" Then
Erreur
ElseIf AddDroite.Text = "Ajouter des caratères par la droite ?" Then
Erreur
End If

Set Dossier = Fso.getFolder(Path.Text)
Set Fichiers = Dossier.Files

For Each Fichier In Fichiers
Longueur = Len(Fichier.Name)
Fichier.Name = Right(Fichier.Name, Longueur - SupGauche.Text)
Fichier.Name = Left(Fichier.Name, Longueur - SupDroite.Text)
Fichier.Name = AddGauche & Fichier.Name & AddDroite
Next

SupGauche/subdroite sont des nombres fournis par l'utilisateur.
AddGauche/adddroite sont des caractères fournis par l'utilisateur.
Le programme fonctionne de manière completement chaotique, enlevant plusieurs caractères alors que je dit "1", répétant plusieurs fois les chaine de caractères etc
Pourriez vous me dire pourquoi ?
A voir également:

5 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
28 mars 2009 à 10:31
Bonjour,
Comme je n'ai pas tes fichiers ni tes données,j'ai un peu adapter pour tester...
Sub Rép()
Dim Dossier As Object
Dim Fichiers As Object, Nom As String
Dim  SG As Integer, SD As Integer
Dim Fso As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set Dossier = Fso.getFolder("D:\test\")
    Set Fichiers = Dossier.Files
SG = 2 'SG = SupGauche.Text
SD = 4 'SD = SupDroite.Text
i = 1
    For Each Fichier In Fichiers
        AddGauche = "0" & i: AddDroite = ".txt"
        Nom = Fichier.Name
        Nom = Mid(Nom, SG + 1)
        Nom = Left(Nom, Len(Nom) - SD)
        Nom = AddGauche & Nom & AddDroite
        Fichier.Name = Nom
        i = i + 1
    Next

    Set Fso = Nothing
End Sub

A+
1
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
28 mars 2009 à 23:47
Merci mais je ne voulais pas mettre de numéros dans mes fichiers. Je voulais juste modifier les noms.
J'ai essayé ton code sans le i mais ça ne marche pas non plus.
En fait ça ne fonctionne que sur un petit nombre de fichiers. Dés que j'en traite un nombre important, le programme déconne et ajoute des bouts de AddGauche à l'infini.
Voici le code mis à jour :

Private Sub Go_Click()
Go.Caption = "C'est parti !"
Dim Dossier As Object
Dim Fichiers As Object
Dim Nom As String
Dim SupNom As String
Dim AddNom As String
Dim Longueur As Integer
Dim Fso As Object
Set Fso = CreateObject("Scripting.FileSystemObject")
If (Fso.FolderExists(Path.Text) = False) Or _
(IsNumeric(SupGauche) = False) Or _
(IsNumeric(SupDroite) = False) Or _
(SupGauche.Text < 0) Or _
(SupDroite.Text < 0) Or _
(AddGauche.Text = "Ajouter des caratères par la gauche ?") Or _
(AddDroite.Text = "Ajouter des caratères par la droite ?") Then
Go.Caption = "Erreur ! Remplissez bien tous les champs."
Exit Sub
End If
Set Dossier = Fso.getFolder(Path.Text)
Set Fichiers = Dossier.Files
For Each Fichier In Fichiers
Longueur = Len(Fichier.Name)
SupNom = Mid(Fichier.Name, SupGauche + 1, (Longueur - SupDroite))
AddNom = AddGauche & SupNom & AddDroite
If Fichier.Name <> AddNom Then
Fichier.Name = AddNom
End If
Next Fichier
Exit Sub
Erreur: Go.Caption = "Erreur ! Plusieurs fichiers portent le même nom."
Exit Sub
End Sub

Est ce que quelqu'un aurait une idée, ne serait ce que pour ralentir le code ?
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
29 mars 2009 à 10:00
Ca irait mieux si tu suivais mon conseil, >>> employer une variable tampon >> "Nom".
J'ai tester et ça fonctionne impec >> Mais si tu veux pas... C'est ton problème
A+
0
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
29 mars 2009 à 20:00
J'ai déja testé ton idée et ça n'a pas marché, c'est pour ca que j'ai essayé avec plusieurs variables.
Le code ne fonctionne que sur un petit nombre de fichiers, c'est pour ça que tes tests ont fonctionné.
Mes tests sur 72 fichiers text vides foirent à chaques fois :

For Each Fichier In Fichiers
Dim Nom As String
Dim Longueur As Integer
Longueur = Len(Fichier.Name)
Nom = Fichier.Name
Nom = AddGauche & (Mid(Nom, SupGauche + 1, (Longueur - SupDroite))) & AddDroite
Fichier.Name = Nom
Next Fichier

ECHEC

For Each Fichier In Fichiers
Dim Nom As String
Dim SupNom As String
Dim AddNom As String
Dim Longueur As Integer
Nom = Fichier.Name
Longueur = Len(Fichier.Name)
SupNom = Mid(Nom, SupGauche + 1, (Longueur - SupDroite))
AddNom = AddGauche & SupNom & AddDroite
If Fichier.Name <> AddNom Then
Fichier.Name = AddNom
End If
Nom = ""
SupNom = ""
AddNom = ""
Longueur = 0
Next Fichier

ECHEC

Et ça foire aussi avec les fonction left/right. Je voudrais essayé de limiter le nombre de fichiers traités simultanément mais je ne vois pas comme avec une boucle for each :/
En tout cas merci pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
29 mars 2009 à 23:03
J'ai finis, a force de tâtonnements, par trouver une solution :
Set Dossier = Fso.getFolder(Path.Text)
Set Fichiers = Dossier.Files

Dim SupNom As String
Dim AddNom As String
Dim Longueur As Integer
Dim X As Integer
X = 0

If SupGauche + SupDroite > 0 Then
For Each Fichier In Fichiers
Fichier.Name = Mid(Fichier.Name, 1 + SupGauche, (Len(Fichier.Name) - SupDroite))
X = X + 1
If X = Fichiers.Count Then
Exit For
End If
Next Fichier
End If

X = 0

If Len(AddGauche & AddDroite) > 0 Then
For Each Fichier In Fichiers
AddNom = Fichier.Name
AddNom = AddGauche & Fichier.Name & AddDroite
Fichier.Name = AddNom
X = X + 1
If X = Fichiers.Count Then
Exit For
End If
Next Fichier
End If

En fait le programme répétait la boucle AddGauche/Droite infiniment et la boucle SupGauche/Droite comme il voulait. (D'où le bordel...)
Y'a donc fallu que je stop moi-même les boucles pour que ça fonctionne correctement.
Je comprend pas bien pourquoi la boucle for each est aussi foireuse :/
0