Automatisch inladen bestanden

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Hallo,

Ik heb een zeer uitgebreide Mediaspeler gemaakt met heel veel functies.
Het enige wat ik nu eigenlijk nog wil is een soort bibliotheek. Ik krijg dit niet voor elkaar.

De bedoeling is een druk op een Button en deze zoekt bijv, alle bestanden met de ext. mp3 enz. Vervolgens schrijft hij deze naar een listbox. Waar ik niet uitkom is hoe kan ik activeren dat hij automatisch alle dir/bestanden op de pc doorzoekt en wegschrijft.

Misschien is dit ook niet mogelijk hoor maar ik hou mij aanbevolen voor hulp hiermee.

Groet
 
Om alle bestanden in de muziek map van je PC op te halen:

PHP:
        For Each mp3 As String In IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "*.mp3", IO.SearchOption.AllDirectories)
            ListBox1.Items.Add(mp3)
        Next

Geeft hier dit terug:

UOl7Q.png


Stel dat je de hele computer wilt doorzoeken, zal je gaan moeten multi-threaden, omdat het ontzettend lang duurt :)

Voorbeeldje:

PHP:
    Private Sub MP3s()
        For Each mp3 As String In IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "*.mp3", _
                                                        IO.SearchOption.AllDirectories)
            Add(mp3)
        Next
    End Sub

    Delegate Sub delAdd(ByVal obj As Object)
    Private Sub Add(ByVal obj As Object)
        If Me.InvokeRequired Then
            Me.Invoke(New delAdd(AddressOf Add), obj)
            Return
        End If
        ListBox1.Items.Add(obj)
    End Sub

Zo start je deze code:

PHP:
        Dim T As New System.Threading.Thread(AddressOf MP3s)
        T.Start()
 
Ik denk dat je meer hebt aan een ListView. Een ListView is geschikter voor een taak als deze, mede omdat je gebruik kan maken van de Tag property om het pad naar de mp3's in op te slaan, en de bestanstandsnaam van de mp3 zelf als ListViewItem text. Eventueel met Extra columns voor extra informatie zoals bitrate, genre, bestandsgrootte, artiest etc.

Hier een voorbeeld van hoe je een ListView vult:

(Voordat je code gaat schrijven, plaats een ListView control en zet View op Details. Voeg ook een column toe in de column editor)

For Each mp3 As String In IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "*.mp3", IO.SearchOption.AllDirectories)

Code:
Dim lviMp3 As New ListViewItem
lviMp3.Text = IO.Path.GetFileName(mp3)
lviMp3.Tag = IO.Path.GetDirectoryName(mp3) & "/"
ListView1.Items.Add(lviMp3)
Next
 
Vervolg

Ik heb beide geprobeerd zowel de listbox als de listview.

Er zijn geen programmerfouten maar ik krijg geen enkele mp3 in mijn box.Op de pc zitten echter wel her en der zon 500 mp3. Nou zal dit beslist niet aan jullie liggen maar waarschijnlijk doe ik het fout.

Groet
 
Probeer deze code eens:

PHP:
For Each mp3 As String In IO.Directory.GetFiles("C:\PadNaarMap", "*.mp3", IO.SearchOption.AllDirectories)
            ListBox1.Items.Add(mp3)
        Next

En dan "C:\PadNaarMap" even aanpassen naar de map waar een aantal liedjes instaan.
 
vervolg

Op zich werkt dit prima. Geen enkel probleem alleen is de bedoeling net iets anders.

Ik moet nu een pad opgeven. De bedoeling is dat het zelfstandig de hele computer doorzoekt op deze files.

Groet
 
PHP:
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
            ListBox1.Items.Add(mp3)
        Next

Gaat wel een tijdje duren voordat ie alles heeft doorgezocht.
 
vervolg

Oke, dit heb ik gedaan maar nu krijg ik onder de laatste ) een rood streeptje en een fout melding
 
vervolg

Ik heb nu het volgende gedaan:

For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next

Ik krijg vervolgens de volgende melding:
Toegang tot het pad C:\$Recycle.Bin\S-1-5-20\ is geweigerd.

Dit heeft waarschijnlijk met administrator rechten oid te maken.

Hoe kan ik dit afvangen zonder de adm. rechten oid te veranderen.
 
Ik persoonlijk denk niet dat het handig is om op C:\ te beginnen met zoeken met SearchOption.AllDirectories omdat deze dan ook verborgen systeem mappen zoals Recycle.Bin wil doorzoeken maar omdat het een verborgen systeem map waar je normaal gesproken never nooit geen toegang toe hebt krijg je dus die error.

Als je je mp3's in je MyMusic map hebt staan en je hebt daar ook nog submappen in staan met mp3's, zoek dan je MyMusic map op mp3's en niet C:\.
 
Laatst bewerkt:
Probeer dit eens? :)

PHP:
On Error Resume Next
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next

*Hopen dat het werkt*
 
vervolg

Klopt wat je zegt en ik begrijp wat je bedoelt alleen het probleem is dat her en der vaak mp3 staan ook bij anderen. Dus mijn vraag is eigenlijk als de PC bij het zoeken bij zon verborgen map komt kan hij deze niet overslaan en naar de volgende gaan? dmv een error afhandeling of iets dergelijks?
 
On Error Resume Next is zo VB6...

Je kan een Try Catch gebruiken. Mocht er een fout ofzo zijn, dan gaat het programma gewoon verder.
 
vervolg

Ja begrijp je hoe bouw ik dat dan in bijvoorbeeld in onderstaande code:

For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next

Ik heb het op de volgende manier gedaan:
Try
Catch exp As Exception
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next
End Try

Maar met deze code gebeurd er helemaal niets.

Groet
 
Nee vind je het gek. :p

Tussen Try en Catch komt datgene dat je wilt uitvoeren. Mocht er tijdens dat process iets misgaan, dan wordt de code dus Catch en End Try uitgevoerd. Dus zo:

Code:
Try
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next
Catch ex As Exception
'Wat er moet gebeuren als er een fout (exception) plaatsvind.
End Try

Ik zei trouwens eerder dat het programma gewoon verder gaat met het vullen van de list maar dat is niet zo, ik zat er effe naast.

En gebruik de volgende keer CODE tags, dan is je code leesbaarder.
 
vervolg

Je hebt inderdaad gelijk ik zal er aan deneken om de code goed te plaatsen. Het programma stopt inderdaad (heb voor de test er een msgbox ingezet)

Hoe programmeer ik dat hij naar de volgende bestand/dir gaat. Na de medling blijft het programma hangen namelijk

Bedankt rouwens voor je reacties
 
Volgens mij zijn jullie eroverheen geskipt, dus nogmaals:

Probeer dit eens? :)

PHP:
On Error Resume Next
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
ListBox1.Items.Add(mp3)
Next

*Hopen dat het werkt*
 
reactie

Nee ook dat heb ik uitgeprobeerd maar ook dan blijft ie hangen en gaat niet verder.
 
Code:
For Each mp3 As String In IO.Directory.GetFiles("C:\", "*.mp3", IO.SearchOption.AllDirectories)
Try
ListBox1.Items.Add(mp3)
Catch ex As Exception
'Wat moet er gebeuren als het fout gaat?
End Try
Next

Misschien het Try-Catch Blok in het For-Each Statement zetten? Dan kijkt-ie voor elk item afzonderlijk of er geen fouten ontstaan.
 
vervolg

Ik heb het inderdaad ook zo gedaan. Er wordt geen foutmelding meer gegeven maar de box blijft leeg. Dus waarschijnlijk loopt hij niet door.
Misschien dat het aan deze volgende regels ligt

'Wat er moet gebeuren als er een fout (exception) plaatsvind.

Ik weet echter niet wat ik hier zou moeten plaatsen om het zoeken door te laten gaan.

Groet
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan