Probleme utilisation de la fonction Dir()

Signaler
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour a tous:

Voici mon problème: en fait je réalise un petit programme pour réaliser un Blind test.
Donc je commence a sélectionner un dossier contenant des fichiers musicaux (dossierMusique).Puis je stock tous les chemins des fichiers de ce dossier dans une listbox pour pouvoir les lire par la suite. Tous cela pour vous situer le contexte.

Jusqu'à présent, tous fonctionnait très bien, ma boucle while me permettait de traiter l'ensemble des fichiers sans problème. j'ai voulu essayer de récupérer un code pour lire les tag du fichier traiter. J'ai donc récupérer la fonction GetTag(chemin du fichier) et j'ai voulu l'utiliser dans ma boucle while pour stocker le titre et l'artiste du fichier.
Le problème est que quand cette ligne est dans ma boucle (GetTag(dossierMusique & "" & FileName) je ne vois plus que 2 fichiers s'afficher dans ma listbox, et cela peut importe le nombre de fichiers du dossierMusique, toujours et seulement 2 fichiers ! quand j'enlève la ligne, je retrouve bien l'intégralité de mes fichiers dans la listbox.
Je trouve cela très bizard !!
Voila le bout de code ou tout se joue:

Dim FileName As String
Dim dossierMusique As String = TextBoxFolder1.Text
Dim PathDossierMusique As String = System.IO.Path.GetFullPath(dossierMusique)

'récupération des noms de fichiers mp3
FileName = Dir(PathDossierMusique & "\*.mp3*")

'nettoyage de la listbox
ListBox1.Items.Clear()

'boucle qui écrit le chemin de tous les fichiers contenus dans le dossier selectionné
Do While FileName <> ""
FileName = Dir()
ListBox1.Items.Add(dossierMusique & "" & FileName)
'GetTag(dossierMusique & "" & FileName)
Loop


J'espere que vous pourrez m'aider, merci d'avance
Cordialement.

11 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Et donc, selon tout logique, on peut en déduire que le problème a des chance de venir du code de la fonction GetTag, code que tu ne donne pas.


MAis déjà, à l'analyse du code donné, on peut dire que tu ne traite pas le tout premier fichier renvoyé par FileName Dir(PathDossierMusique & "\*.mp3*") puisque tu l'écrase immédiatement par FileName Dir()


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
14791
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
16 mai 2021
155
Bonjour,

De plus, en .NET, il y a System.IO.File.* et System.IO.Directory.*

System.IO.Directory.GetFiles(...) par exemple.

Mon site
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Re

effectivement, pas très judicieux de ne pas avoir donné le code de getTag, désolé.
Le voici du coup :

Public Structure GetTag1
Dim Titre As String
Dim Artiste As String
Dim Album As String
Dim Année As String
Dim Commentaire As String
End Structure

Public LTagMp3 As GetTag1

Public Function GetTag(ByRef Fichier As String) As GetTag1
Try
Dim Chiffre As Integer
Dim Texte As String
Chiffre = FreeFile()
If Dir(Fichier) <> "" Then
FileOpen(Chiffre, Fichier, OpenMode.Binary)
Texte = Space(CInt(LOF(Chiffre)))
FileGet(Chiffre, Texte, LOF(Chiffre) - 127)
If Mid(Texte, 1, 3) = "TAG" Then
Texte = Mid(Texte, 4)
LTagMp3.Titre = Trim(Mid(Texte, 1, 30))
LTagMp3.Artiste = Trim(Mid(Texte, 31, 30))
LTagMp3.Album = Trim(Mid(Texte, 61, 30))
LTagMp3.Année = Trim(Mid(Texte, 91, 4))
LTagMp3.Commentaire = Trim(Mid(Texte, 95, 30))
GetTag.Titre = LTagMp3.Titre
GetTag.Artiste = LTagMp3.Artiste
GetTag.Album = LTagMp3.Album
GetTag.Année = LTagMp3.Année
GetTag.Commentaire = LTagMp3.Commentaire
End If
FileClose(Chiffre)
End If
Catch
End Try

End Function



A casy : effectivement tu as noté un autre probleme que j'avais! mais comment le régler du coup ?? parce que si j'enleve le filename = dir() le programme se bloque...!

Merci beacoup pour vos réponses,
cordialement.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Et oui, comme pressenti dans GetTag tu réutilise la fonction Dir ce qui fausse son utilisation dans ta boucle.
parce que si j'enlève le filename = dir() le programme se bloque

Il ne faudra pas l'enlever mais le placer judicieusement, c'est à dire après ton traitement, juste avant la fin de la boucle.


Mais comme le disait NHenry, en .Net, et particulièrement dans ton cas, il vaut mieux utiliser System.IO.Directory.GetFiles à la place de Dir, abandonner la boucle while et la remplacer par une boucle For Each sur la collection de string que te renvoie GetFiles

Puis dans GetTag, tu peut aussi remplacer Dir(Fichier) <> "" par System.IO.File.Exist(Fichier)


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
dommage de coder en pseudo .Net


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Merci pour ces réponses.

J'ai donc modifié la fonction GetTag et cela se passe beacoup mieux maintenant !

j'ai tenté de suivre vos conseils pour changer mon code et utiliser System.IO.Directory.GetFiles à la place de dir() mais je patauge un peu..
Je n'arrive plus à récupérer le nom de chaque fichier, j'ai bien le chemin mais plus le nom !
il y a un truc que je ne vois pas ! le "GetFileName" est censé me donner le nom des fichiers mais il me renvoit le nom du dossierMusique..


Dim dossierMusique As String = TextBoxFolder1.Text
'Dim PathDossierMusique As String = System.IO.Path.GetFullPath(dossierMusique)

Dim retourValeur As String()

retourValeur = System.IO.Directory.GetFiles(dossierMusique)

'nettoyage de la listbox
ListBox1.Items.Clear()

For Each fichier As String In retourValeur

Dim nomFichier As String
nomFichier = System.IO.Path.GetFileName(dossierMusique)
ListBox1.Items.Add(nomFichier)

Next


Merci pour votre aide
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
que c'est confus...

est censé me donner le nom des fichiers mais il me renvoit le nom du dossierMusique..


censé ? pourquoi, parce que tu le souhaites ?

ce n'est pas ce que tu lui demandes, donc...

tu demandes:
System.IO.Path.GetFileName(dossierMusique)

du coup, oui, il te renvoie le nom du dossier...


observe:

Imports System.IO

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dossierMusique As String = "C:"
        For Each nomFichier As String In Directory.GetFiles(dossierMusique)
            MessageBox.Show(Path.GetFileNameWithoutExtension(nomFichier))
        Next
    End Sub
End Class




Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

Bonjour

Merci pour ta réponse renfield et excuse moi pour mon approche un peu confuse, je suis débutant et j'ai tendance à y aller par tatonnement pour le moment..

Ce que je veux faire maintenant c'est stocker le titre et l'artiste de chaque fichier dans des listboxs. Lorsque que les tags des mp3 sont bien remplis, tout se passe bien. Mais lorsque la propriété artiste est vide par exemple, il remet le dernier artiste trouvé. J'ai donc essayer de faire le code pour que lorsqu'il tombe sur un fichier ou il manque les tag, qu'il ecrive simplement un point d'interrogation. Mais cela ne marche pas et je ne vois pas pourquoi !
pourtant la syntaxe me parait correct..je dois encore une fois oublier qq chose !

merci d'avance pour votre aide

        For Each fichier As String In retourValeur

            If GetExtension(fichier) = ".mp3" Then

                ListBox1.Items.Add(fichier)
                GetTag(fichier)

                If TagMp3.Artiste <> "" Then
                    listBoxArt.Items.Add(TagMp3.Artiste)
                Else
                    listBoxArt.Items.Add("?")
                End If

                If TagMp3.Titre <> "" Then
                    ListBoxTi.Items.Add(TagMp3.Titre)
                Else
                    ListBoxTi.Items.Add("?")
                End If

            End If
        Next
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
joues avec un listview plutot que n listbox.

sinon, pour ton artiste, assures toi de bien avoir une ahcine vide et non pas " " par exemple

pour cela, ajoutes un point d'arret sur ta ligne

If TagMp3.Artiste <> "" Then

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
34
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
25 septembre 2010

je suis désolé mais je n'ai pas compris ta ligne
sinon, pour ton artiste, assures toi de bien avoir une ahcine vide et non pas " " par exemple

pourrais tu également me rappeler ce qu'est un point d'arret et comment l'ajouter!

Merci beacoup.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
F9 pour un point d'arret

c'est comme son nom l'indique un point ou l'execution du code s'arretera (pause)
te permettant de controler pas a pas l'execution du code, le contenu de tes variables, etc.


Renfield - Admin CodeS-SourceS - MVP Visual Basic