for each met endswith

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Ik heb de volgende codevoor het inladen van een folder:

Code:
 For Each item In ListBox3.Items
                If item.EndsWith(".mp3") Then ListBox2.Items.Add(item)
                If item.EndsWith(".flac") Then ListBox2.Items.Add(item)
                If item.EndsWith(".wav") Then ListBox2.Items.Add(item)
                If item.EndsWith(".mp4") Then ListBox2.Items.Add(item)
                Next

Bij het inladen van een folder van mp3 bestanden danwel flac enz geen enkel probleem totdat er een file tussen staat met bijv. jpg. Deze neemt ie dus niet mee zoals het hoort maar laadt verder ook niets in en stopt.

Groet
 
Dat lijkt me niet te liggen aan bovenstaande code. maar dat kun je natuurlijk ook eenvoudig vaststellen met een "break"punt.
 
De volledige code is als volgt:

Code:
Try
            Dim FolderBrowserDialog1 As New FolderBrowserDialog
            With FolderBrowserDialog1
                .RootFolder = Environment.SpecialFolder.Desktop
                .SelectedPath = "c:\windows"
                .Description = "Select the source directory"
                If .ShowDialog = DialogResult.OK Then
                    Dim FileDirectory As New IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath)
                    Dim FilesFromDirectory As IO.FileInfo() = FileDirectory.GetFiles()
                    For Each File As IO.FileInfo In FilesFromDirectory
                        Me.ListBox3.Items.Add(File.FullName)
                    Next
                Else : Exit Sub
                End If
                

            End With
            For Each item In ListBox3.Items
                If item.EndsWith(".mp3") Then ListBox2.Items.Add(item)

                If item.EndsWith(".flac") Then ListBox2.Items.Add(item)
                If item.EndsWith(".wav") Then ListBox2.Items.Add(item)
                If item.EndsWith(".mp4") Then ListBox2.Items.Add(item)
                
            Next
            ListBox1.Items.Clear() : Form2.ListBox1.Items.Clear()
            For Each item In ListBox2.Items
                ListBox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(item))
                           Next
          
            '     Me.Text = "Aantal songs in afspeellijst: " & ListBox1.Items.Count
            ListBox1.SelectedIndex = 0
            ListBox2.SelectedIndex = ListBox1.SelectedIndex
            WissenToolStripMenuItem.Enabled = True
        Catch ex As Exception
            MsgBox("U kunt niet een hoofddirectory inladen. ", vbOKOnly, "Perfect Media V3.1")
        End Try

Uiteindelijk moeten de songs vanuit invisible listbox3 terecht komen in:

listbox2(invisible) met verwijzing naar patj enz
listbox1 visible dus de uiteindelijke playlist zonder path en extensie

Als ik het blok met endswith weghaal dan pakt hij wel alle items maar dus ook de jpg enz
 
Probeer mijn GetFiles functie eens met bijbehorende Enum:

Code:
    ''' <summary>What file method to use.</summary>
    Public Enum FileMethod
        ''' <summary>Returns the full path.</summary>
        FullPath
        ''' <summary>Returns the directory.</summary>
        Directory
        ''' <summary>Returns the filename with extension.</summary>
        FileNameWithExtension
        ''' <summary>Returns the filename without extension.</summary>
        FileNameWithoutExtension
        ''' <summary>Returns the file extension.</summary>
        FileNameExtension
    End Enum
    ''' <summary>A function that returns files that match the specified filters.</summary>
    ''' <param name="sPath">The path to get the files from.></param>
    ''' <param name="Method">What to get from the specified path.></param>
    ''' <param name="sFilters">The filters to use. Syntax is "*.*", "*.*", "*.*", etc.</param>
    Public Shared Function GetFiles(ByVal sPath As String, ByVal Method As FileMethod, ByVal ParamArray sFilters() As String) As String()

        Dim strList As New List(Of String)

        For Each Filter As String In sFilters
            For Each File In Directory.GetFiles(sPath, Filter)
                If Not strList.Contains(File) Then
                    Select Case Method
                        Case FileMethod.FullPath
                            strList.Add(File)
                        Case FileMethod.Directory
                            strList.Add(IO.Path.GetDirectoryName(File))
                        Case FileMethod.FileNameWithExtension
                            strList.Add(IO.Path.GetFileName(File))
                        Case FileMethod.FileNameWithoutExtension
                            strList.Add(IO.Path.GetFileNameWithoutExtension(File))
                        Case FileMethod.FileNameExtension
                            strList.Add(IO.Path.GetExtension(File))
                    End Select
                End If
            Next
        Next
        Return strList.ToArray

    End Function

Gebruiken doe je zo:

Code:
        For Each File As String In GetFiles("Pad hier", FileMethod.FileNameWithoutExtension, "*.mp3*", "*.flac", "*.wav", "*.mp4")
            ListBox1.Items.Add(File)
        Next
 
Soory bedankt maar ik zou niet weten hoe ik dit moest doen maar mijn code zou toch ook moeten werken?
 
Zowiezo kan je code een stuk korter gemaakt worden, die onzichtbare ListBox bijvoorbeeld is eigenlijk overbodig.

Gebruik gewoon je bestaande FolderBrowsingDialog voor het pad, en laat vervolgens met een For Each elk bestand aflopen en als een bestand overeenkomt met de opgegeven bestandstypen toevoegen aan de ListBox.

Overigens denk ik dat een ListView beter geschikt is voor een taak als deze, omdat een ListView meer informatie kan vasthouden zoals het volledige pad die verder onzichtbaar is voor de gebruiker als je die opslaat in de Tag property van elk individueel ListViewItem.
 
Ik heb het volgende even getest (ik sla de tussenstap met hidden listboxes e.d. over, verder is het exact jouw code) en dan werkt het zoals verwacht

Code:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim FileDirectory As New IO.DirectoryInfo("f:\download")
        Dim FilesFromDirectory As IO.FileInfo() = FileDirectory.GetFiles()
        For Each File As IO.FileInfo In FilesFromDirectory
            If File.FullName.EndsWith(".exe") Then ListBox1.Items.Add(File.FullName)
            If File.FullName.EndsWith(".zip") Then ListBox1.Items.Add(File.FullName)
        Next

    End Sub

Deze directory bevat bij mij een rijke mix .rar, .7z, .exe, .zip, .msi, .img, .iso en nog veel meer extenties en ik krijg netjes alleen .zip en .exe files in mijn listbox. Ik kan zo ook geen logica problemen zien met je aanpak. Ik zou er toch eens item voor item doorheen lopen en zien waar het vastloopt
 
Is 'hidden listbox' niet een beetje achterhaald? Dat moet makkelijker kunnen.

Kun je even uitleggen wat je precies wil? Je hebt een folder die je wilt inladen.
Wat wil je met die files doen? Wat is het probleem? :confused:
 
vervolg

De fout zit in de onderstaande code:
Als ik het programma draai en 708 mp3 in wil laden worden er in listbox2 maar 234 mp3ingeladen. In listbox 3 worden wel alle 708 mp3 ingeladen.
Ik heb het een voor een nagelopen en zag dat er gewoon mp3 bestanden werden overgslagen. Alle bestanden zijn wel mp3 bestanden en niet corrupt of iets dergelijks. Ze spelen normaal af.

Code:
For Each item In ListBox3.Items
                If item.EndsWith(".mp3") Then ListBox2.Items.Add(item)
                If item.EndsWith(".flac") Then ListBox2.Items.Add(item)
                If item.EndsWith(".wav") Then ListBox2.Items.Add(item)
                If item.EndsWith(".mp4") Then ListBox2.Items.Add(item)
                Next
 
Inderdaad, ik geloof dat *.mp3 en *.MP3 gezien word als twee verschillende extensies.

Maar heb je mijn code wel bekeken, het is echt een stuk handiger in gebruik, ondanks de bijbehorende Enumuration waar je waarschijnlijk niet bekent mee bent?
 
Ik ben toch maar gaan spelen met de enum code van jou en het eerste begrijp ik dan niet hoeft ook niet want de rest van de code is wel duidelijk en met de volgende
aanpassing

Code:
For Each File As String In GetFiles(TextBox4.Text, FileMethod.FullPath, "*.mp3*", "*.flac", "*.wav", "*.mp4")
                ListBox2.Items.Add(File)
            Next

dus Fullpath werkt het tenminste kan gewoon meeerdere folders etc inladen alleen drop en drag moet ik nog aanpassen maar neem aan dat dit op dezelfde manier kan.

Rest mij toch uiteindelijk heel erg te bedanken

Groetjes
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan