Jump to content
Sign in to follow this  
mkmcst

file scan

Recommended Posts

mkmcst

hi all i got this bit of code of the forum

but it runs real slow and i was looking for a way to search c drive a lil bit fast this bit of code for me moves slow i would love some Ideas if anyone has one

thank you

michael

; Searches all subfolders of $sPath for $sFindFile (* and ? wildcards accepted)

; Returns an array containing full path and name of all matches.

; Number of matches is in zero index of array

Func _FindPathName($sPath, $sFindFile)

Local $sSubFolderPath, $iIndex, $aFolders

$search = FileFindFirstFile($sPath & "\" & $sFindFile)

$aFolders = _FileListToArray($sPath, "*", 2)

While 1

$file = FileFindNextFile($search)

If @error Then

ExitLoop

Else

$sRet &= $sPath & "\" & $file & "|"

EndIf

WEnd

FileClose($search)

For $iIndex = 1 To $aFolders[0]

$sSubFolderPath = $sPath & "\" & $aFolders[$iIndex]

$aFoldersSubs = _FileListToArray($sSubFolderPath, "*", 2)

If IsArray($aFoldersSubs) Then _FindPathName($sSubFolderPath, $sFindFile)

Next

Return StringSplit(StringTrimRight($sRet,1), "|")

EndFunc ;==>_FindPathName

Share this post


Link to post
Share on other sites
BugFix

It's not exactly, what you want. But so you get (with good speed) the first occurance of an file.

;===============================================================================
; Function Name:   _SearchTreeForFile($sRootPath, $sFileName)
; Description::    Filesearch in given path and all subdirectories
; Parameter(s):    $sRootPath   directory to start search
;                  $sFileName   file to search
; Return Value(s): if found     path of file
;                  not found    0
; Author(s):       BugFix (bugfix@autoit.de)
;===============================================================================
Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp", 'long', 'SearchTreeForFile', 'str', _
            $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
        Return $aRet[3]
    Else
        Return 0
    EndIf
EndFunc  ;==>_SearchTreeForFile

Best Regards BugFix  

Share this post


Link to post
Share on other sites
Nirvana6

This is code I found here on these forums (thanks to weaponx).

I just added some input boxes for easier use.

hope this helps :)

#comments-start; 
_FileSearch( "Path and Mask", <$nOption>, <$cpusaver>, <$dirfilter>, <$filefilter>)

;----PARAMETERS-----
;$nOption -   <Optional (0 - normal, 1- recursive)>
;$cpusaver -  <Optional (0 - normal, 1 - CPU Friendly, but Slower)>
;$dirfilter - <Optional (0 - list directories, 1 - filter out directories)>
;$filefilter- <Optional (0 - list files, 1 - filter out files)>
#comments-end



$Path= InputBox ("Disk Drive" , "Drive Letter")
$Mask= InputBox ("File&Folders" , "Mask")
#include<array.au3>

$a = _FileSearch( $Path&$Mask, 1, 0, 1, 0)
_ArrayDisplay($a)
MsgBox (0 ,"User Name " ,@UserName )


Func _FileSearch($szMask, $nOption = 0, $cpusaver = 0, $dirfilter = 0, $filefilter = 0)
    $szRoot = ""
    $hFile = 0
    $szBuffer = ""
    $szReturn = ""
    $szPathList = "*"
    Dim $aNULL[1]

    If Not StringInStr($szMask, "\") Then
        $szRoot = @ScriptDir & "\"
    Else
        While StringInStr($szMask, "\")
            $szRoot = $szRoot & StringLeft($szMask, StringInStr($szMask, "\"))
            $szMask = StringTrimLeft($szMask, StringInStr($szMask, "\"))
        WEnd
    EndIf
    If $nOption = 0 Then
        _FileSearchUtil($szRoot, $szMask, $szReturn, $cpusaver, $dirfilter, $filefilter)
    Else
        While 1
            $hFile = FileFindFirstFile($szRoot & "*.*")
            If $hFile >= 0 Then     
                $szBuffer = FileFindNextFile($hFile)
                While Not @error
                    If $szBuffer <> "."  And $szBuffer <> ".."  And _
                            StringInStr(FileGetAttrib($szRoot & $szBuffer), "D") Then _
                            $szPathList = $szPathList & $szRoot & $szBuffer & "*"
                    $szBuffer = FileFindNextFile($hFile)
                    
                WEnd
                FileClose($hFile)
            EndIf
            _FileSearchUtil($szRoot, $szMask, $szReturn, $cpusaver, $dirfilter, $filefilter)
            If $szPathList == "*"  Then ExitLoop
            $szPathList = StringTrimLeft($szPathList, 1)
            $szRoot = StringLeft($szPathList, StringInStr($szPathList, "*") - 1) & "\"
            $szPathList = StringTrimLeft($szPathList, StringInStr($szPathList, "*") - 1)
        WEnd
    EndIf
    If $szReturn = "" Then
        $aNULL[0] = 0
        Return $aNULL
    Else
        Return StringSplit(StringTrimRight($szReturn, 1), "*")
    EndIf
EndFunc   ;==>_FileSearch

Func _FileSearchUtil(ByRef $ROOT, ByRef $MASK, ByRef $RETURN, $cpusaver, $dirfilter, $filefilter)
    $hFile = FileFindFirstFile($ROOT & $MASK)
    If $hFile >= 0 Then
        
        $szBuffer = FileFindNextFile($hFile)
        While Not @error
            If $cpusaver = 1 Then Sleep(1)                                  ;OPTIONAL FOR CPU SAKE
            If $szBuffer <> "."  And $szBuffer <> ".."  Then
                If StringInStr(FileGetAttrib($ROOT & $szBuffer), "D") Then
                    If $dirfilter = 0 Then $RETURN = $RETURN & $ROOT & $szBuffer & "*"
                Else
                    If $filefilter = 0 Then $RETURN = $RETURN & $ROOT & $szBuffer & "*"
                EndIf
            EndIf
            $szBuffer = FileFindNextFile($hFile)
        WEnd
        FileClose($hFile)
    EndIf
EndFunc

Share this post


Link to post
Share on other sites
Spiff59

Or look at some of the many _FileListToArray examples in this thread

Share this post


Link to post
Share on other sites
ssimpson

This code works great but is there any way to use wildcards? for instance I want to search all application data folders for .EXE files. Well each App Data folder resides within a user names folder. I.E. C:\Documents and Settings\John\Application Data, C:\Documents and Settings\Larry\Application Data, etc....

This is code I found here on these forums (thanks to weaponx).

I just added some input boxes for easier use.

hope this helps :)

#comments-start; 
_FileSearch( "Path and Mask", <$nOption>, <$cpusaver>, <$dirfilter>, <$filefilter>)

;----PARAMETERS-----
;$nOption -   <Optional (0 - normal, 1- recursive)>
;$cpusaver -  <Optional (0 - normal, 1 - CPU Friendly, but Slower)>
;$dirfilter - <Optional (0 - list directories, 1 - filter out directories)>
;$filefilter- <Optional (0 - list files, 1 - filter out files)>
#comments-end



$Path= InputBox ("Disk Drive" , "Drive Letter")
$Mask= InputBox ("File&Folders" , "Mask")
#include<array.au3>

$a = _FileSearch( $Path&$Mask, 1, 0, 1, 0)
_ArrayDisplay($a)
MsgBox (0 ,"User Name " ,@UserName )


Func _FileSearch($szMask, $nOption = 0, $cpusaver = 0, $dirfilter = 0, $filefilter = 0)
    $szRoot = ""
    $hFile = 0
    $szBuffer = ""
    $szReturn = ""
    $szPathList = "*"
    Dim $aNULL[1]

    If Not StringInStr($szMask, "\") Then
        $szRoot = @ScriptDir & "\"
    Else
        While StringInStr($szMask, "\")
            $szRoot = $szRoot & StringLeft($szMask, StringInStr($szMask, "\"))
            $szMask = StringTrimLeft($szMask, StringInStr($szMask, "\"))
        WEnd
    EndIf
    If $nOption = 0 Then
        _FileSearchUtil($szRoot, $szMask, $szReturn, $cpusaver, $dirfilter, $filefilter)
    Else
        While 1
            $hFile = FileFindFirstFile($szRoot & "*.*")
            If $hFile >= 0 Then     
                $szBuffer = FileFindNextFile($hFile)
                While Not @error
                    If $szBuffer <> "."  And $szBuffer <> ".."  And _
                            StringInStr(FileGetAttrib($szRoot & $szBuffer), "D") Then _
                            $szPathList = $szPathList & $szRoot & $szBuffer & "*"
                    $szBuffer = FileFindNextFile($hFile)
                    
                WEnd
                FileClose($hFile)
            EndIf
            _FileSearchUtil($szRoot, $szMask, $szReturn, $cpusaver, $dirfilter, $filefilter)
            If $szPathList == "*"  Then ExitLoop
            $szPathList = StringTrimLeft($szPathList, 1)
            $szRoot = StringLeft($szPathList, StringInStr($szPathList, "*") - 1) & "\"
            $szPathList = StringTrimLeft($szPathList, StringInStr($szPathList, "*") - 1)
        WEnd
    EndIf
    If $szReturn = "" Then
        $aNULL[0] = 0
        Return $aNULL
    Else
        Return StringSplit(StringTrimRight($szReturn, 1), "*")
    EndIf
EndFunc   ;==>_FileSearch

Func _FileSearchUtil(ByRef $ROOT, ByRef $MASK, ByRef $RETURN, $cpusaver, $dirfilter, $filefilter)
    $hFile = FileFindFirstFile($ROOT & $MASK)
    If $hFile >= 0 Then
        
        $szBuffer = FileFindNextFile($hFile)
        While Not @error
            If $cpusaver = 1 Then Sleep(1)                                  ;OPTIONAL FOR CPU SAKE
            If $szBuffer <> "."  And $szBuffer <> ".."  Then
                If StringInStr(FileGetAttrib($ROOT & $szBuffer), "D") Then
                    If $dirfilter = 0 Then $RETURN = $RETURN & $ROOT & $szBuffer & "*"
                Else
                    If $filefilter = 0 Then $RETURN = $RETURN & $ROOT & $szBuffer & "*"
                EndIf
            EndIf
            $szBuffer = FileFindNextFile($hFile)
        WEnd
        FileClose($hFile)
    EndIf
EndFunc

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.