Eigenlijk is dit topic net zo goed thuis in Programming, maar aangezien het in dit specifieke geval om Access gaat heb ik het hier geplaatst.
In de database die ik gebruik staan artikelen met een tekeningnummer. De technische tekeningen zijn opgeslagen in een netwerkmap (totaa: 54.000 tekeningen, 104 mappen, 28 GB). Met een druk op de knop wil ik deze tekening op kunnen zoeken op de netwerkschijf. Op zich ias dit geen 'rocket science' met de Dir() functionaliteit in VB, ware het niet voor het feit dat deze functie geen submappen ondersteund.
De meest logische oplossing is een 'recursive call' gebruiken. Een aantal voorbeeldscripts heb ik bij elkaar gesprokkeld, verbeterd en hiermee heb ik de volgende functie geschreven:
Een knop roept de Zoekfunctie als volgt:
Het probleem hiermee is echter dat de code veel en veel te langzaam is. Het duurt ongeveer 42 seconden om een bestand te zoeken terwijl dit in de verkenner, met dezelfde bestandsnaam slechts enkele seconden duurt. Is er een manier om dit script te verbeteren? Via msdn heb ik al wat informatie gevonden die belangrijk is bij het 'recursive' aanroepen van functies, maar ik ben simpelweg niet handig genoeg met VB om dit nog meer te versnellen.
Wat denken jullie ervan?
In de database die ik gebruik staan artikelen met een tekeningnummer. De technische tekeningen zijn opgeslagen in een netwerkmap (totaa: 54.000 tekeningen, 104 mappen, 28 GB). Met een druk op de knop wil ik deze tekening op kunnen zoeken op de netwerkschijf. Op zich ias dit geen 'rocket science' met de Dir() functionaliteit in VB, ware het niet voor het feit dat deze functie geen submappen ondersteund.
De meest logische oplossing is een 'recursive call' gebruiken. Een aantal voorbeeldscripts heb ik bij elkaar gesprokkeld, verbeterd en hiermee heb ik de volgende functie geschreven:
Visual Basic: SearchFiles
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
36
37
38
39
40
41
| ' ------------------------------------------------------------------------------- ' 1. Search files in 'strDir' and create a list with files ' that are found 'colFiles' with their full path included. ' 2. Can search in subdirectories if needed (InclSubDirs). ' 3. A file mask 'strFileMask' can be set to specify the name or extension of the file. ' ------------------------------------------------------------------------------- Public Function SearchFiles(colFiles As Collection, strDir As String, strFileMask As String, bInclSubDirs As Boolean) Dim strDirFile As String Dim colFolders As New Collection Dim vFolderName As Variant ' Prepare the path: add a backslash and trim any spaces strDir = Trim(strDir) If Right(strDir, 1) <> "\" Then strDir = strDir & "\" 'Add files in strDir matching strFileMask to colFiles strDirFile = Dir(strDir & strFileMask) Do While strDirFile <> vbNullString colFiles.Add strDir & strDirFile strDirFile = Dir Loop 'Fill colFolders with list of subdirectories of strDir If bInclSubDirs Then strDirFile = Dir(strDir, vbDirectory) Do While strDirFile <> vbNullString If (strDirFile <> ".") And (strDirFile <> "..") Then If (GetAttr(strDir & strDirFile) And vbDirectory) <> 0 Then colFolders.Add strDirFile End If End If strDirFile = Dir Loop 'Recursively call SearchFiles for each subfolder in colFolders For Each vFolderName In colFolders Call SearchFiles(colFiles, strDir & vFolderName, strFileMask, True) Next vFolderName End If End Function |
Een knop roept de Zoekfunctie als volgt:
Visual Basic: Knop voor Zoekfunctie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| Private Sub cmdFetch_Click() Dim Drawing As String Drawing = Me.txtDrawing.Value ' Call the search function. Dim colFiles As New Collection SearchFiles colFiles, "F:\Tekeningen\", Drawing, True ' Print list to debug window Dim vFile As Variant For Each vFile In colFiles Debug.Print vFile Next vFile ' Print to debug window when no file was found If colFiles.Count = 0 Then Debug.Print "Could not find file!" End If End Sub |
Het probleem hiermee is echter dat de code veel en veel te langzaam is. Het duurt ongeveer 42 seconden om een bestand te zoeken terwijl dit in de verkenner, met dezelfde bestandsnaam slechts enkele seconden duurt. Is er een manier om dit script te verbeteren? Via msdn heb ik al wat informatie gevonden die belangrijk is bij het 'recursive' aanroepen van functies, maar ik ben simpelweg niet handig genoeg met VB om dit nog meer te versnellen.
Wat denken jullie ervan?
[ Voor 5% gewijzigd door Josh op 06-05-2011 16:30 ]