Probleme utilisation de la fonction Dir()

Chiche69 Messages postés 34 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 25 septembre 2010 - 21 févr. 2010 à 20:02
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 22 févr. 2010 à 15:50
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 févr. 2010 à 20:20
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
21 févr. 2010 à 20:33
Bonjour,

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

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

Mon site
0
Chiche69 Messages postés 34 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 25 septembre 2010
21 févr. 2010 à 20:56
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 févr. 2010 à 21:11
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
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 févr. 2010 à 22:21
dommage de coder en pseudo .Net


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Chiche69 Messages postés 34 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 25 septembre 2010
22 févr. 2010 à 00:26
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 févr. 2010 à 08:52
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
0
Chiche69 Messages postés 34 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 25 septembre 2010
22 févr. 2010 à 15:01
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 févr. 2010 à 15:29
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
0
Chiche69 Messages postés 34 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 25 septembre 2010
22 févr. 2010 à 15:37
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.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 févr. 2010 à 15:50
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
0
Rejoignez-nous