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.
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
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...!
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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)
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
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
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.