(VB.NET) complete folder lijst

Pagina: 1
Acties:
  • 127 views sinds 30-01-2008
  • Reageer

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
VB.NET: Ik probeer een functie te schrijven die alle directories in een directorie teruggeeft.
Dat wil dus zeggen, ook alle sub directories, en de sub directories daarvan enz.

Ik heb vanalles geprobeerd maar dat lukt mij niet.

Laatste voorbeeldje code: lijkt de tweede keer getdirlist gewoon te negeren en nog een aantal rare dingen.
Hij geeft hier alleen de eerste subdirectorie weer, en die ook nog eens 2 keer. En de rest van de subdirectories dus niet, en en ook de subdirectories van die subdirectories niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fnc As functions = New functions
        Dim tmp As String
        For Each tmp In fnc.GetDirList("c:\wix\")
            TextBox1.AppendText(tmp + vbCrLf)
        Next
    End Sub
End Class

Public Class functions
    Public Function GetDirList(ByVal path As String)
        Dim tmp, val As String
        Dim dirs(0) As String
        Dim tmps() As String
        Dim fc As functions = New functions
        Dim t As Integer

        tmp = Dir(path, FileAttribute.Directory Or FileAttribute.Hidden Or FileAttribute.System Or FileAttribute.ReadOnly Or FileAttribute.Archive)
        While tmp <> ""
            If (GetAttr(path + tmp) And FileAttribute.Directory) = FileAttribute.Directory Then
                ReDim Preserve dirs(t)
                dirs(t) = tmp
                t = t + 1
                tmps = fc.GetDirList(tmp)
                For Each val In tmps
                    ReDim Preserve dirs(t)
                    dirs(t) = tmp + val
                    t = t + 1
                Next
            End If
            tmp = Dir()
        End While
        GetDirList = dirs
    End Function
End Class

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
Je zult het met een recursieve functie moeten oplossen.

https://fgheysels.github.io/


Verwijderd

Je maakt gewoon een functie die alle directory's uitleest en per directory die je vind doe je doe functie weer... Lekker recursief dus ;)

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ja, en dan heb je pas twee levels gehad. Zoals je weet bestaan er soms weet ik hoeveel levels aan sub-directories. Denk maar aan c:\windows\system32\drivers\etc. En je hebt nog veel grotere directories met nog meer subdirectories. Dus recursief lijkt me een beetje onmogelijk.

Daarbij snap ik niet waarom die code niet werkt. Zover ik weet horen afzonderlijke instanties van een object los van elkaar te opereren. Dus zal dit gewoon moeten werken.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Scorpion1984 schreef op woensdag 15 december 2004 @ 22:56:
Ja, en dan heb je pas twee levels gehad. Zoals je weet bestaan er soms weet ik hoeveel levels aan sub-directories. Denk maar aan c:\windows\system32\drivers\etc. En je hebt nog veel grotere directories met nog meer subdirectories. Dus recursief lijkt me een beetje onmogelijk.

Daarbij snap ik niet waarom die code niet werkt. Zover ik weet horen afzonderlijke instanties van een object los van elkaar te opereren. Dus zal dit gewoon moeten werken.
De truuk van recursieve functies is, dat het (theoretisch) oneindig lang doorgaat.
Je hebt een functie met bv. een string (van de main-dir) en een (ByRef) ArrayList.
Het enige wat de functie doet, is de main-dir-string in de ArrayList zetten en van alle kinderen van de dir, de zelfde functie weer aanroepen.
De functie wordt dan weer aangeroepen, maar dan niet met de main-dir-string, maar met één van de kinderen. Die doorloopt weer die hele functie, waardoor ook weer die kinderen aangeroepen worden.

Deze methode is voor programmeurs best effeciënt, omdat het code scheelt. Nadeel is dat het relatief meer resources opslurpt :9 . Maargoed, lekker belangrijk.

Verder bevat je code nogal wat ruis en kan het denk ik heel wat korter; wat is het doel van de variabele fc? En je kan er eventueel een Shared Function van maken (in mijn uitleg wordt het toch een Sub :) ), zodat je geen instance van de class hoeft te maken.

Ook is de functie Dir obsolete denk ik; zit in Microsoft.VisualBasic (da's voor mij een teken dat het eigenlijk uit VB6 komt). Ik adviseer System.IO.Directory en misschien ook DirectoryInfo (zag het staan, misschien ook leuk :) ).

offtopic:
Net als Dir versus Directory, is er bv. ook Collection vs. HashTable (ik ga altijd voor de laatste, eigenlijk)

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ok, ik weet niet of dat lukt wat jij zegt maar zal het proberen.

Mijn probleem is bijvoorbeeld dat ik op 1 of andere manier geen "oneindige" array kan maken. Ik moet hem telkens redimmen en 1tje groter maken, kan dit niet makkelijker?

Maar dan snap ik nog steeds net waarom mijn voorbeeld niet werkt.
Je maakt namelijk een instance aan van het object functions, runt zijn function GetDirList, maakt daarin een NIEUWE instance van het object functions, en runt zijn function GetDirList. Dat zou naar mijn idee, en ervaring met andere talen moeten werken. Waarom werkt dit dan niet?

[ Voor 18% gewijzigd door Scorpion1984 op 16-12-2004 09:18 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:00
In .NET heb je een ArrayList. Dat is een collectie waar je items kunt aan toevoegen. De arraylist zal zichzelf laten groeien indien nodig.

https://fgheysels.github.io/


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Scorpion1984 schreef op donderdag 16 december 2004 @ 09:16:
Ok, ik weet niet of dat lukt wat jij zegt maar zal het proberen.

Mijn probleem is bijvoorbeeld dat ik op 1 of andere manier geen "oneindige" array kan maken. Ik moet hem telkens redimmen en 1tje groter maken, kan dit niet makkelijker?

Maar dan snap ik nog steeds net waarom mijn voorbeeld niet werkt.
Je maakt namelijk een instance aan van het object functions, runt zijn function GetDirList, maakt daarin een NIEUWE instance van het object functions, en runt zijn function GetDirList. Dat zou naar mijn idee, en ervaring met andere talen moeten werken. Waarom werkt dit dan niet?
Zie whoami voor het ArrayList gebeuren.

Zoals ik al zei, het hele object aanmaken kan je eigenlijk laten varen. Gewoon Shared gebruiken (je functie gebruikt de rest van de class toch niet en doet een taak voor je en verder wordt er niks opgeslagen, dus kan dat best).

Op zich is het netjes om bij de functie aan te geven wat je teruggeeft.
Wat doet Dir eigenlijk? (Zoek dat eens uit; maar zoals ik al zei, kijk in System.IO).
En waar ga je met het path naar de kinderen, want path+tmp, is dat niet gewoon (bv) "C:\"+"C:\", ofzo?

Het hele idee is dat je die (ByRef!!) ArrayList steeds doorgeeft (aan dezelfde functie) en uitbreidt (gaat dus automatisch) en helemaal aan het eind is de ArrayList gevuld en is het klaar.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Dir geeft eerste entry (file, directorie) op het path aan. (bij c:\ is dat dus meestal "documents and settings") bij dir zonder argumenten, geeft hij de volgende entry terug, enzovoors.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Ik weet niet wat die functie in werkelijkheid doet, maar ik denk dat ie het niet kan waarderen, dat je de functie nog een keer aanroept.
Oftewel, Dir() is waarschijnlijk een Shared functie. Als je eerst het path doorgeeft, dan doet ie, maar als je de functie opnieuw opgeeft en dus ook een nieuwe path, dan loopt het niet.
Daarbij geeft Dir() directories terug zonder "\".

Als ik het recursieve eruit haal (dus die aanroep) dan worden alle directories op top-level doorlopen. Zet ik het recursieve erbij dan looptie vast op "AUTOEXEC.BAT", nadat ie de eerste directory heeft gehad.

[ Voor 23% gewijzigd door MrSleeves op 16-12-2004 12:50 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Het is me gelukt, als er nog mensen zijn die het willen weten, dit is de code: (GetDirList gebruiken, GetDir is voor GetDirList)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    Private Function GetDirList(ByVal path As String) As ArrayList
        Dim tmp As DirectoryInfo
        Dim dirInfo As DirectoryInfo = New DirectoryInfo(path)
        Dim tmps As New ArrayList
        Dim collection As New ArrayList
        Dim tmp2 As String
        Dim tmps2 As New ArrayList

        For Each tmp In dirInfo.GetDirectories
            tmps.Add(tmp.Name)
        Next

        While tmps.Count <> 0
            collection.Add(tmps(0))
            tmps2 = GetDir(path, tmps(0))
            For Each tmp2 In tmps2
                tmps.Add(tmps(0) & "\" & tmp2)
            Next
            tmps.Remove(tmps(0))
        End While

        GetDirList = collection
    End Function

    Private Function GetDir(ByVal rootPath As String, ByVal path As String) As ArrayList
        Dim dirs As New ArrayList
        Dim tmp As DirectoryInfo
        Dim dirInfo As DirectoryInfo = New DirectoryInfo(rootPath & path)
        For Each tmp In dirInfo.GetDirectories
            dirs.Add(tmp.Name)
        Next
        GetDir = dirs
    End Function

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Sorry, kan het niet laten: :P

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Public Overloads Shared Function GetDirList(ByVal path As String) As ArrayList
        Dim dirInfo As New IO.DirectoryInfo(path)
        Dim list As New ArrayList
        GetDirList(dirInfo, list)
        Return list
    End Function

    Public Overloads Shared Sub GetDirList(ByVal path As IO.DirectoryInfo, ByRef list As ArrayList)
        list.Add(path.FullName)
        Try
            For Each child As IO.DirectoryInfo In path.GetDirectories
                GetDirList(child, list)
            Next
        Catch ex As Exception
            'Kan gebeuren dat je geen rechten hebt ofzo...
            'Zover wilde ik er geen tijd in steken..
        End Try
    End Sub

[ Voor 3% gewijzigd door MrSleeves op 16-12-2004 20:18 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Ik zou dit niet op 'C:\' uitvoeren en op een computer met aardig wat files, want dan hoop ik dat de koffiemachine flink vol zit ;)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

EfBe schreef op donderdag 16 december 2004 @ 20:55:
Ik zou dit niet op 'C:\' uitvoeren en op een computer met aardig wat files, want dan hoop ik dat de koffiemachine flink vol zit ;)
Ja, dat zeker.. En je hebt soms geen rechten (o.a. System Volume Information) en dat vertraagd helemaal.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ah daar was ik inderdaad nog bezig hoe ik de crash van het programma kon onderscheppen als hij geen rechten heeft, bedankt.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Scorpion1984 schreef op donderdag 16 december 2004 @ 21:39:
Ah daar was ik inderdaad nog bezig hoe ik de crash van het programma kon onderscheppen als hij geen rechten heeft, bedankt.
Deze manier van exception-afhandeling is natuurlijk niet echt netjes. Je moet eigenlijk een manier zien te vinden, waardoor je de exception niet krijgt; dus door te checken of je wel rechten hebt. Zo'n exception kost nogal wat extra tijd namelijk.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 17-05 11:19
Ok, dat is een to do voor de tweede release, eerst maar eens zorgen dat alles werkt,
Pagina: 1