Hi,
hier habe ich eine recht komplexe Routine, die zu einem vorgegebenen Verzeichnis, folgendes ermittelt:
die Gesamtzahl der Unterverzeichnisse im Verzeichnisbaum (also SubDirectories, SubSubDirectories ... etc.)
die Gesamtzahl der File im Verzeichnisbaum
die Gesamtanzahl der Bytes aller Files im Verzeichnisbaum.
Das klingt gar nicht so schwierig ... aber es gibt folgende Verschärfung: Wenn ein Verzeichnis oder ein File nicht zugreifbar ist, weil die Berechtung dazu fehlt, dann soll das Dingens einfach ignoriert werden. Auf Wunsch kann man eine Liste der nicht zugreifbaren Objekte anzeigen.
Das ist mein Coding:
Das Ding funktioniert auch prima! Allerdings dauert die Verarbeitung etwa der Systemresidenz ca. 45 Sekunden. Das scheint mir ein bissl lang zu sein.
Hat jemand Ideen wie man die Performance verbessern könnte? Denn darauf kommt es schon an ... meine Systemresidenz hat etwa 60.000 Directories und 220.000 Files ... da spielt das schon eine Rolle, ob der Code performant ist.
Ich schätze mal, dass man mindestens diese Kiste intelligenter abhandeln könnte:
Ich weiß, das ist sehr viel verlangt ... es sind zwar nur 30 Zeilen Code (beim Erstellen der Basis Routine hat mir RFG massiv zur Seite gestanden) ... aber die paar Zeilen haben es in sich. Es wäre nett, wenn jemand sich die Sache mal freundlich angucken könnte.
LG
Peter
hier habe ich eine recht komplexe Routine, die zu einem vorgegebenen Verzeichnis, folgendes ermittelt:
die Gesamtzahl der Unterverzeichnisse im Verzeichnisbaum (also SubDirectories, SubSubDirectories ... etc.)
die Gesamtzahl der File im Verzeichnisbaum
die Gesamtanzahl der Bytes aller Files im Verzeichnisbaum.
Das klingt gar nicht so schwierig ... aber es gibt folgende Verschärfung: Wenn ein Verzeichnis oder ein File nicht zugreifbar ist, weil die Berechtung dazu fehlt, dann soll das Dingens einfach ignoriert werden. Auf Wunsch kann man eine Liste der nicht zugreifbaren Objekte anzeigen.
Das ist mein Coding:
VB.NET-Quellcode
- Shared Function GetTreeInfo(ByVal directory As DirectoryInfo,
- ByVal errorHandler As Action(Of FileSystemInfo)) As Long
- Dim dirlen As Long = 0 'Initialize directory size field
- Try
- Dim enrDirs As IEnumerable(Of DirectoryInfo) = directory.EnumerateDirectories() 'Get list of all subdirectories in directory
- TreeSubDirectoriesCount += enrDirs.Count 'Accumulate directories (Module1 field)
- Dim enrFiles As IEnumerable(Of FileInfo) = directory.EnumerateFiles() 'Get list of all files in directory
- TreeSubFilesCount += enrFiles.Count 'Accumulate files (Module1 field)
- Try
- dirlen = enrFiles.Sum(Function(f) f.Length) 'Accumulate length (f.Length) of all files (f) into dirlen ...
- ' '... dirlen wil be changed,when the call has completed
- Catch exp As UnauthorizedAccessException 'Not enough access rights for file
- dirlen = enrFiles.Sum(Function(f)
- Try
- Return f.Length
- Catch ex As UnauthorizedAccessException
- errorHandler(f) 'Call errorHandler with the file that caused the error ...
- Return 0 '... and return 0 bytes for this file
- End Try
- End Function)
- End Try
- dirlen += directory.EnumerateDirectories().Sum(Function(dir) GetTreeInfo(dir, errorHandler)) 'recursive call - accumulate file lengths
- Catch ex As UnauthorizedAccessException 'Not enough access rights for directory
- errorHandler(directory) 'Call errorHandler with the directory that caused the error
- Catch ex As DirectoryNotFoundException 'Call errorHandler if directory not found
- errorHandler(directory)
- End Try
- Return dirlen 'Return total length of directory
- End Function
Das Ding funktioniert auch prima! Allerdings dauert die Verarbeitung etwa der Systemresidenz ca. 45 Sekunden. Das scheint mir ein bissl lang zu sein.
Hat jemand Ideen wie man die Performance verbessern könnte? Denn darauf kommt es schon an ... meine Systemresidenz hat etwa 60.000 Directories und 220.000 Files ... da spielt das schon eine Rolle, ob der Code performant ist.
Ich schätze mal, dass man mindestens diese Kiste intelligenter abhandeln könnte:
VB.NET-Quellcode
- Dim enrDirs As IEnumerable(Of DirectoryInfo) = directory.EnumerateDirectories() 'Get list of all subdirectories in directory
- TreeSubDirectoriesCount += enrDirs.Count 'Accumulate directories (Module1 field)
- Dim enrFiles As IEnumerable(Of FileInfo) = directory.EnumerateFiles() 'Get list of all files in directory
- TreeSubFilesCount += enrFiles.Count 'Accumulate files (Module1 field)
Ich weiß, das ist sehr viel verlangt ... es sind zwar nur 30 Zeilen Code (beim Erstellen der Basis Routine hat mir RFG massiv zur Seite gestanden) ... aber die paar Zeilen haben es in sich. Es wäre nett, wenn jemand sich die Sache mal freundlich angucken könnte.
LG
Peter
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Peter329“ ()