# VBForums CodeBank > CodeBank - ASP / ASP.NET / MVC / Web API >  Directory Index and Search

## bobbo

Here is my script for indexing a directory (any directory, including network drives - should work with UNC paths too) and searching for matching files.  In this version, it simply executes the files (i.e. opens them with their associated program), but you could customize the resultant actions to suit your needs.

This was built as a homemade replacement to Locate32 (see http://lifehacker.com/397406/locate3...-and-reliably).  The limitation of Locate32 and other desktop search apps (including Google desktop) is that the index is local to each user: as the number of users increases, so does the number of indexes and their load on the network server!  With this script, there's only one shared index to maintain, and it's refreshed on a schedule you define.



```
'define search parameters
const cintMinSearchLength = 3 'min length of search string
const cintRefreshTime = 8 'hours before index will be refreshed
const cintOpenMax = 24 'max number of files will attempt to open simultaneously
const cintOpenWarn = 4 'max number of files will attempt to open before warning the user

'define search parameters
strSearchDir = "R:\Drawings"
Set objShell = CreateObject("WScript.Shell")
strIndexDir = objShell.CurrentDirectory
strIndexFile = strIndexDir & "\Drawings.idx"
strFilter = "*.pdf"
strWindowTitle = "File Search v1.00"

'ask user what drawing to open
strSearch = InputBox("Please enter a partial filename:" & vbNewLine & vbNewLine & _
				"Searches: " & strSearchDir, strWindowTitle)
strSearch = Trim(strSearch)
If Len(strSearch) < cintMinSearchLength Then
	Wscript.Quit 0
End If

'query index file dates
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='" & strIndexDir & "'} Where " _
        & "ResultClass = CIM_DataFile")

'regenerate index file if too old
'code credit: http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec07/hey1211.mspx
strCurrentDate = Now
boolFoundIndex = False
For Each objFile In colFiles
	strCurrentFile = objFile.Drive & objFile.Path & objFile.FileName & "." & objFile.Extension
	If InStr(1,strCurrentFile,strIndexFile,1) Then
	    strFileDate = WMIDateStringToDate(objFile.LastModified)
	    intHours = DateDiff("h", strFileDate, strCurrentDate)
	    'intMinutes = DateDiff("n", strFileDate, strCurrentDate)
	    If intHours >= cintRefreshTime Then
			RefreshIndex strSearchDir, strFilter, strIndexFile
	    End If
		boolFoundIndex = True
	End If
Next

'generate index file if not found
If Not boolFoundIndex Then
	RefreshIndex strSearchDir, strFilter, strIndexFile
End If

'setup search to find desired part number in index files
'cdoe credit http://www.microsoft.com/technet/scriptcenter/resources/qanda/may08/hey0505.mspx
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRegExp = new RegExp
With objRegExp
	.Pattern = "^.*" & strSearch & ".*$"
	.Global = True
	.IgnoreCase = True
	.Multiline = True
End With

'load index file
Set objSearchIndex = objFSO.GetFile(strIndexFile)
strContents = objFSO.OpenTextFile(strIndexFile, 1, false).Read(objSearchIndex.Size)

'execute search
Set objMatches = objRegExp.Execute(strContents)

'open results for viewing
If objMatches.Count > 0 Then
	If objMatches.Count > cintOpenMax Then
		'abort if too many matches found
		intResult = MsgBox(objMatches.Count & " matches found." & vbNewLine & _
						"Please try your search again." & vbNewLine & _
						"(Program will now exit.)", 48, _
						strWindowTitle)
		Wscript.Quit 0
	ElseIf objMatches.Count > cintOpenWarn Then
		'warn user if opening more than a few matches
		intResult = MsgBox(objMatches.Count & " matches found." & vbNewLine & _
						"Are you sure you want to open all of these for viewing?", 4, _
						strWindowTitle)
		If intResult = 6 Then 'yes
			For Each objMatch in objMatches
				objShell.Run "cmd /c start """" """ & objMatch.Value & """", 0, False
			Next
		Else 'no
			Wscript.Quit 0
		End If
	Else
		'only a few matches, so go ahead and open them
		For Each objMatch in objMatches
			objShell.Run "cmd /c start """" """ & objMatch.Value & """", 0, False
		Next
	End If
Else
	MsgBox "No drawings found for """ & strSearch & """.", strWindowTitle
End If


'code credit: http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec07/hey1211.mspx
Function WMIDateStringToDate(dtmInstallDate)
    WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & _
        Mid(dtmInstallDate, 7, 2) & "/" & Left(dtmInstallDate, 4) _
            & " " & Mid (dtmInstallDate, 9, 2) & ":" & _
                Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate, _
                    13, 2))
End Function

Function RefreshIndex(strSearchDir, strFilter, strIndexFile)
	objShell.Run "cmd /c echo Please wait while " & strSearchDir & _
		" is indexed... & dir /b /s """ & strSearchDir & _
		"\" & strFilter & """ > " & strIndexFile, 1, True
End Function
```

----------


## mendhak

Thanks for this.  I've moved your code sample to the codebank forum for ASP/ASP.NET.

----------

