All Directory

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Hallo,

Ik wil graag de volgende gegevens in een listview:

Door op button1 te drukken wordt de c:\schijf autoatisch doorlopen. Vervolgens schrijft het eerste de bovenliggende mappen, de mappen daar weer onder enz. Dus wil ik graag onderelkaar alle mappen zien staan.
 
Nee geen treeview. Gewoon een listview waarin alle bestaande mappen terechtkomen dus
dus de hoofdmap met ook de onderliggende mappen. Dus ik heb bijvoorbeeld:

muziek/audio/bestandenmp3
spellen/woordspellen/lingo
enz:
Graag zou ik dan zien dat in de listview komt:

Muziek
Audio
Bestandenmp3
Spellen
Woordspellen
Lingo
enz
 
Dat lijkt me nou totaal niet handig om dat in een ListView te doen, een TreeView zou in een geval als dit veel beter zijn.
 
Ja inderdaad dat bedoel ik die code zou ik graag willen. heb wel zoiets maar daar komen de files dan ook bij en die wil ik dus niet zoals jij weergeeft dus op de foto.
 
Voila hier is de code, de LET OP goed lezen!

Oke hier is de code:

LET OP
Voor mijn 'C:\' -schijf te laden die ~130GB duurt het toch ~5minuten dat je form niet meer reageerd dit kan je vermijden door het in een thread the gooien en je usewaitingcursor als true te zetten heb ik in de code toegepast.

Vereiste imports:
Code:
Imports System
Imports System.IO
Imports System.Threading

Variabelen:
Code:
Dim thread As Thread
Dim directories As New List(Of DirectoryInfo)()

Form Load event
Code:
CheckForIllegalCrossThreadCalls = False

De laad button click event
Code:
thread = New Thread(AddressOf Loader)
thread.Name = "Loader"
thread.Priority = ThreadPriority.Highest
thread.Start()

De 'Loader' code
Code:
Private Sub Loadx()
  Me.UseWaitCursor = True 'aantonen dat de form bezig is (zandlopertje op xp)
  GetDirectories(New DirectoryInfo("C:\")) 'Deze laad alle subdirectories van de aangegeven map / schijf

  For Each s As DirectoryInfo In directories
      'listview1 is de listview op mijn form
      ListView1.Items.Add(New ListViewItem(New String() {s.FullName}))
      thread.Sleep(0) 'anders gebruikt de applicatie teveel cpu
  Next

  Me.UseWaitCursor = False 'gedaan met laden, gaat terug naar oude cursor

  MsgBox("Alle folders zijn geladen")
End Sub

De 'GetDirectories' code
Code:
Private Sub GetDirectories(ByVal dirx As DirectoryInfo)
  Try
      Dim subdirectories() As DirectoryInfo = dirx.GetDirectories()

      For Each dir As DirectoryInfo In subdirectories
           Me.directories.Add(dir)
           GetDirectories(dir)
           thread.Sleep(0) 'anders gebruikt de applicatie te veel cpu
      Next
      Console.WriteLine(String.Format("Loaded '{0}'", dirx.FullName)) 'voor als je wilt weten welke map geladen is
    Catch ex As Exception
      Console.WriteLine(ex.Message) 'er zijn redelijk veel folders die je geen toegang toestaan daarom deze exception handler
  End Try
End Sub

Veel succes!
 
Ik zei dat het opgelost was maar het programma loopt toch vast"

Je code was: Private Sub Loadx()

De thread is: thread = New Thread(AddressOf Loader)

I dit fout of zie ik iets over het hoofd.

ik bedoel dus loadx en loader is verschillend
 
oops ja Private Sub Loadx() moet Private Sub Loader() worden,
Vond Loadx belachelijk en heb het hier nog eventjes aangepast maar precies niet overal ;)
mijn fout

En voor de rest werkt het dus nog?
 
Hallo,
Het voorbeeld werkt prima, maar omdat ik de grootte wilde hebben heb ik twee dingen gedaan:

Code:
 Private Function GetDirectorySize(ByVal sPath As String, Optional ByVal Units As UnitType = UnitType.Auto) As String
        Dim Dir As New DirectoryInfo(sPath)
        Dim Bytes As Long
        For Each directory As DirectoryInfo In Dir.GetDirectories("*.*", SearchOption.AllDirectories)
        Next
        For Each File As FileInfo In Dir.GetFiles("*.*", SearchOption.AllDirectories)
            Bytes += File.Length
            '  aantalfiles = aantalfiles + 1
        Next
        Return FormatSize(Bytes, Units)
    End Function
    Private Shared Function FormatSize(ByVal Bytes As Long, Optional ByVal Units As UnitType = UnitType.Auto) As String
        Select Case Units
            Case 0
                Return Fix(Bytes) & " Bytes"
            Case 1
                Return Format(Bytes / 1024, "#0.00") & " KB"
            Case 2
                Return Format(Bytes / 1024 / 1024, "#0.00") & " MB"
            Case 3
                Return Format(Bytes / 1024 / 1024 / 1024, "#0.00") & " GB"
            Case Else
                If Bytes >= 1073741824 Then
                    Return Format(Bytes / 1024 / 1024 / 1024, "#0.00") & " GB"
                ElseIf Bytes >= 1048576 Then
                    Return Format(Bytes / 1024 / 1024, "#0.00") & " MB"
                ElseIf Bytes >= 1024 Then
                    Return Format(Bytes / 1024, "#0.00") & " KB"
                ElseIf Bytes > 0 And Bytes < 1024 Then
                    Return Fix(Bytes) & " Bytes"
                Else
                    Return "0 Bytes"
                End If
        End Select
    End Function
    ''' <summary>Data units to get.</summary>
    Private Enum UnitType
        ''' <summary>Returns the size in bytes.</summary>    
        Bytes
        ''' <summary>Returns the size in kilobytes.</summary>
        Kilobytes
        ''' <summary>Returns the size in megabytes.</summary>
        Megabytes
        ''' <summary>Returns the size in giabytes.</summary>
        Gigabytes
        ''' <summary>Returns the size based on the file that is being passed in.</summary>
        Auto
    End Enum
    ''' <summary>Returns the filesize of a specified file.</summary>
    ''' <param name="sFile">The file to get the filesize of.</param>
    ''' <param name="Units">The data unit to use (GB, MB, KB or Bytes).</param>
    ''' <returns>Returns a string containing the filesize.</returns>


Vervolgens de listview als volgt aagepast:

For Each s As DirectoryInfo In directories
'listview1 is de listview op mijn form
' ListView1.Items.Add(New ListViewItem(New String() {s.FullName}))
ListView1.Items.Add(s.FullName)
ListView1.Items.Item(ListView1.Items.Count - 1).SubItems.Add(GetDirectorySize(s.FullName))
thread.Sleep(0) 'anders gebruikt de applicatie teveel cpu
Next

Vervolgens loopt het programma dus nu wel wee rvast bij de folders waar ik geen toegang heb
 
Dan moet je administrator-rechten vragen.
 
Het is wel handig om admin rechten te geven aan dit programma want zoals je uit de console output al hebt kunnen aflezen krijg je redelijk (bij mij toch) veel UnauthorizedException bij een aantal folders en ik vermoed dat die op te lossen vallen met admin rechten. Maar dat is gewoon een ideetje ;)

Veel succes, met de rest van je programma(tje)!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan