Hallo zusammen,
ich bin neu hier und habe folgendes Problem:
Ich habe ein Tool geschrieben, welches es ermöglicht, ab einem beliebigen Startpfad alle Unterordner zu durchlaufen, die darin enthaltenen Daten auszuwerten, eine Statistik dazu zu erstellen und hinterher, selektierte Dateien inklusive der Verzeichnisstruktur in einen beliebigen Zielpfad zu kopieren.
Das funktioniert auch alles schon. Allerdings ist es bei Startpunkten mit extrem vielen Unterverzeichnissen und vielen Dateien wenig performant.
Ich gehe davon aus, dass das zwei Ursachen hat - zum einen, die Rekursion beim Durchlaufen der Verzeichnisse, zum anderen die vielen Operationen mit long Datentypen, die für die statistische Auswertung der Daten notwendig sind.
Gibt es eine Möglichkeit die Verzeichnisse ohne Rekursion zu durchlaufen, und habt ihr sonst Vorschläge zur Optimierung des Codes?
Ich bin für jede Hilfe dankbar. Hier zunächst einmal der meines Erachtens nach "bremsende" Codeausschnitt:
ich bin neu hier und habe folgendes Problem:
Ich habe ein Tool geschrieben, welches es ermöglicht, ab einem beliebigen Startpfad alle Unterordner zu durchlaufen, die darin enthaltenen Daten auszuwerten, eine Statistik dazu zu erstellen und hinterher, selektierte Dateien inklusive der Verzeichnisstruktur in einen beliebigen Zielpfad zu kopieren.
Das funktioniert auch alles schon. Allerdings ist es bei Startpunkten mit extrem vielen Unterverzeichnissen und vielen Dateien wenig performant.
Ich gehe davon aus, dass das zwei Ursachen hat - zum einen, die Rekursion beim Durchlaufen der Verzeichnisse, zum anderen die vielen Operationen mit long Datentypen, die für die statistische Auswertung der Daten notwendig sind.
Gibt es eine Möglichkeit die Verzeichnisse ohne Rekursion zu durchlaufen, und habt ihr sonst Vorschläge zur Optimierung des Codes?
Ich bin für jede Hilfe dankbar. Hier zunächst einmal der meines Erachtens nach "bremsende" Codeausschnitt:
Quellcode
- ' Sub durchlaufe - Durchläuft die gesamte Struktur durch Rekursion
- Sub durchlaufe(path As String)
- On Error GoTo wartemarke
- ' Deklaration
- Dim name$, a%, i%
- ' Pfad anvisieren
- name = Dir(path, vbDirectory)
- ' a speichert die Ordnerstelle (Index), da Dir() nicht rekursiv speichert
- a = 0
- ' Hier passiert alles
- While name <> ""
- ' Wenn Ordner dann gehe rekursiv rein, sonst überprüfe Dateiendung
- If name <> "." And name <> ".." Then
- On Error Resume Next
- If (ordner(GetAttr(path & name))) Then
- On Error Resume Next
- durchlaufe(path & name & "\")
- On Error Resume Next
- name = Dir(path, vbDirectory)
- On Error Resume Next
- For i = 1 To a
- name = Dir()
- On Error Resume Next
- Next i
- Else
- ' Hier geschieht die Dateianalyse
- 'If Len(path & name) > 1 Then
- On Error Resume Next
- x = My.Computer.FileSystem.GetFileInfo(path & name).Length
- z = My.Computer.FileSystem.GetFileInfo(path & name).CreationTime
- y = dateiendung(name)
- alter = getalter(z)
- flag = False
- If alter = True Then
- alt = alt + x
- Else
- neu = neu + x
- End If
- If alter = True And y = "xlsm" Or y = "xlsx" Or y = "ppt" Or y = "pps" Or y = "ppsx" Or y = "pot" Or y = "pptx" Or y = "potx" Or y = "doc" Or y = "docx" Or y = "docm" Or y = "xls" Or y = "xlsx" Or y = "xlsm" Or y = "csv" Or y = "cal" Or y = "eml" Or y = "emm" Or y = "pdf" Or y = "txt" Or y = "vcf" Or y = "vcs" Then
- altoffice = altoffice + x
- flag = True
- ElseIf alter = False And y = "xlsm" Or y = "xlsx" Or y = "ppt" Or y = "pps" Or y = "ppsx" Or y = "pot" Or y = "pptx" Or y = "potx" Or y = "doc" Or y = "docx" Or y = "docm" Or y = "xls" Or y = "xlsx" Or y = "xlsm" Or y = "csv" Or y = "cal" Or y = "eml" Or y = "emm" Or y = "pdf" Or y = "txt" Or y = "vcf" Or y = "vcs" Then
- neuoffice = neuoffice + x
- flag = True
- End If
- If alter = True And y = "aac" Or y = "avi" Or y = "bmp" Or y = "emf" Or y = "gif" Or y = "ico" Or y = "jpeg" Or y = "jpg" Or y = "m4a" Or y = "mp3" Or y = "mp4" Or y = "png" Or y = "wav" Or y = "wma" Or y = "wmf" Or y = "wmv" Then
- altmultimedia = altmultimedia + x
- flag = True
- ElseIf alter = False And y = "aac" Or y = "avi" Or y = "bmp" Or y = "emf" Or y = "gif" Or y = "ico" Or y = "jpeg" Or y = "jpg" Or y = "m4a" Or y = "mp3" Or y = "mp4" Or y = "png" Or y = "wav" Or y = "wma" Or y = "wmf" Or y = "wmv" Then
- neumultimedia = neumultimedia + x
- flag = True
- End If
- If alter = True And y = "zip" Or y = "rar" Or y = "7z" Then
- altarchiv = altarchiv + x
- flag = True
- ElseIf alter = False And y = "zip" Or y = "rar" Or y = "7z" Then
- neuarchiv = neuarchiv + x
- flag = True
- End If
- If alter = True And flag = False Then
- altother = altother + x
- ElseIf alter = False And flag = False Then
- neuother = neuother + x
- End If
- zeile = zeile + 1
- End If
- End If
- If False Then
- wartemarke: zaehler = zaehler + 1
- End If
- 'End If
- a = a + 1
- ' Auf nächsten Ordner zugreifen
- name = Dir()
- On Error Resume Next
- End While
- End Sub
- Function ordner(i As Integer) As Boolean
- Dim a$
- a = ""
- While i <> 0
- If i Mod 2 = 1 Then
- a = "1" & a
- i = i - 1
- Else
- a = "0" & a
- End If
- i = i / 2
- End While
- If Len(a) < 5 Then
- ordner = False
- ElseIf "1" <> Mid(a, Len(a) - 4, 1) Then
- ordner = False
- Else
- ordner = True
- End If
- End Function