Scriptfehler?!

  • Hallo zusammen

    Ich kämpfe gerade mit folgendem Script:


    [autoit]


    #include <Array.au3>
    $STARTPFAD="c:\MyFolder"
    $SUCHORDNER="GesuchtesVerzeichniss"
    $DATEN=_GETFILELIST($STARTPFAD,"n",1)
    $RET=_ARRAYSEARCH($DATEN,$SUCHORDNER,1,0,0,TRUE )

    [/autoit][autoit][/autoit][autoit]

    If $ret > 0 Then MsgBox(0, '', $Daten[$ret]) ; gibt den kpl.Pfad zurück
    If $ret <= 0 Then
    MsgBox(4096, "Test", $ret)
    Exit
    EndIf
    Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
    Dim $N_DIRNAMES[200000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    Local $FILEMASK
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $FILEMASK = "n" Then $FILEMASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR,1) = "" Then $T_DIR = StringTrimRight($T_DIR,1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Or _
    StringInStr(FileGetAttrib( $N_TFILE ),"D,H,S") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    Wend
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "" & $T_MASK )
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Or _
    StringInStr(FileGetAttrib( $N_TFILE ),"D,H,S") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    Wend
    FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES,1)
    $N_OFILE = StringSplit($T_FILENAMES,@CR)
    Return( $N_OFILE )
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

    [/autoit]

    Bei mir führt dieser zu "-1" auch wenn das Verzeichniss existiert X(

    Irgendwie finde ich den Fehler nicht - ich hoffe ihr entdeckt den bei der durchsicht ;(

    Surfy

  • ach daaaa!

    sieht ein bissl unformatiert aus das ganze, drum hab ichs wohl übersehen :)

    was soll die funktion denn tun?

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

    • Offizieller Beitrag

    Ich mag die rekursiven Funktionen lieber. :)
    Zum Beispiel diese:

    Spoiler anzeigen
    [autoit]


    $sStartPath = 'c:\Users\'
    $sSearchFolder = 'Music'

    [/autoit] [autoit][/autoit] [autoit]

    ToolTip('Suche läuft! Bitte warten...')
    $aFound = _SearchFolder($sStartPath, $sSearchFolder)
    If Not @error Then
    ToolTip('')
    ConsoleWrite($aFound[0] & ' Treffer' & @CR)
    For $i = 1 To $aFound[0]
    ConsoleWrite($i & '.) "' & $aFound[$i] & '"' & @CR)
    Next
    Else
    ConsoleWrite('Error: ' & @error & @CR)
    ToolTip('')
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _SearchFolder($sPath, $sFolder, $iRek = 0)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    Local $hSearch, $sFound, $sOut = '', $aFileAttr, $hDll = DllOpen('kernel32.dll')
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If Not @error Then
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aFileAttr = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFound)
    If @error Or BitAND($aFileAttr[0], 0x400) Then ContinueLoop
    If $sFound = $sFolder Then $sOut &= $sPath & $sFound & '|'
    $sOut &= _SearchFolder($sPath & $sFound, $sFolder, $iRek + 1)
    EndIf
    WEnd
    FileClose($hSearch)
    EndIf
    DllClose($hDll)
    If $iRek = 0 And $sOut <> '' Then Return SetError(0, 0, StringSplit(StringTrimRight($sOut, 1), '|'))
    If $sOut <> '' Then Return SetError(0, 0, $sOut)
    Return SetError(1, 0, '')
    EndFunc ;==>_SearchFolder

    [/autoit]
  • Danke für eure Hilfe!

    Ich habe ein Verzeichniss welches dynamisch weiter Unterverzeichnisse und Dateien enthält. Füge ich über eine Applikation weiter Inhalte dazu, werden diese dynamisch angelegt - auf jedem Client kann so eine anderer Namen verwendet sein

    C:\MyFolder\

    C:\MyFolder\n\xxxx

    Leider haben die Verzeichnisse noch Sonderzeichen im Namen.

    c:\MyFolder\D\[_B_]Misc1[_E_]\MyDB\

    Ich suche also Beispielsweise nach MyDB und erhalte dann c:\MyFolder\D\[_B_]Misc1[_E_]\ zurück

    Ich suche einen Weg um Verzeichnisse oder Dateien zu suchen - bzw dann den Pfad dahin anzuzeigen, den ich für die weitere Verarbeitung brauche. Mein Beispiel im ersten Posting ist noch zu klobig, ich bekomme nur den ersten Fall - wo das Verzeichniss vorkam - nach Dateien alleine konnte ich denke ich gar nicht suchen.

    Leider steigt bei den Sonderzeichen die von Dir gespostete Function aus, Oskar ;( Gibt es da noch einen Workarround?

    x0r leider bin ich mit dem adaptieren deines Scriptes noch nicht zu einem durchbruch gekommen,

    [autoit]

    Dim $FILES
    Dim $DIR="C:\Programme\autoit3" ; specify the directory to search
    Dim $FILEMASK="n" ; specify the filemask ("n" for GetDirOnly)
    $FILES = _GetFileList($DIR, $FILEMASK, 1) ; _GetFileList($DIR, $FILEMASK [, Flag]) Flag GetFile(Default) = 0 , GetDirOnly = 1
    For $X = 0 To UBound($FILES)-1
    MsgBox(0,'test:' & $X,$FILES[$X])
    Next
    Exit

    [/autoit]

    Da versuche ich immer noch zu verstehen, wo denn da der Suchparameter verborgen ist, bzw wie ich die Suche anstossen könnte :evil:

    Surfy

    • Offizieller Beitrag

    Die Funktion, die ich gepostet habe kommt mit Sonderzeichen (aus Deinem Beispiel) problemlos zurecht. Das habe ich gerade getestet.
    Allerdings sucht sie nur nach Verzeichnissen. Hier mal die abgewandelte Version für Verzeichnisse und Dateien:

    Spoiler anzeigen
    [autoit]


    $sStartPath = 'c:\Users\'
    $sSearchword = 'MyDB'

    [/autoit] [autoit][/autoit] [autoit]

    ToolTip('Suche läuft! Bitte warten...')
    $aFound = _SearchFileFolder($sStartPath, $sSearchword)
    If Not @error Then
    ToolTip('')
    ConsoleWrite($aFound[0] & ' Treffer' & @CR)
    For $i = 1 To $aFound[0]
    ConsoleWrite($i & '.) "' & $aFound[$i] & '"' & @CR)
    Next
    Else
    ConsoleWrite('Error: ' & @error & @CR)
    ToolTip('')
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _SearchFileFolder($sPath, $sSearchword, $iRek = 0)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    Local $hSearch, $sFound, $sOut = '', $aFileAttr, $hDll = DllOpen('kernel32.dll')
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If Not @error Then
    While True
    $sFound = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aFileAttr = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFound)
    If @error Or BitAND($aFileAttr[0], 0x400) Then ContinueLoop
    If StringInStr($sFound, $sSearchword) Then $sOut &= $sPath & $sFound & '|'
    $sOut &= _SearchFileFolder($sPath & $sFound, $sSearchword, $iRek + 1)
    Else
    If StringInStr($sFound, $sSearchword) Then $sOut &= $sPath & $sFound & '|'
    EndIf
    WEnd
    FileClose($hSearch)
    EndIf
    DllClose($hDll)
    If $iRek = 0 And $sOut <> '' Then Return SetError(0, 0, StringSplit(StringTrimRight($sOut, 1), '|'))
    If $sOut <> '' Then Return SetError(0, 0, $sOut)
    Return SetError(1, 0, '')
    EndFunc ;==>_SearchFolder

    [/autoit]