drive complett search

  • Hi Leute

    ich hab ein kleines Problem mit Autoit ich hab zwei functions geschrieben die erstens die komplette Ordner structur und zweitens die komplette file bzw die zu suchenden fileends auflisten.

    mein Problem ist das Filefindnextfile anscheinend ein file nur durch einen Stringcheck verifiziert zb dasklo.bmp <--succs das.klo.bmp<--fail

    Bitte um schnelle Hilfe

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <array.au3>

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

    Func drive_search_folder($drive)
    $drive=StringReplace($drive,"\","")
    $get_drive=DriveGetDrive("All")
    For $i=1 To $get_drive[0]
    If $drive = $get_drive[$i] Then ExitLoop
    If $i=$get_drive[0] Then Return 0
    Next

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

    local $folder_array[1],$x=1
    $folder_dect=FileFindFirstFile($drive&"\*.")
    If $folder_dect = -1 Then Exit

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

    While 1
    $folder_id=FileFindNextFile($folder_dect)
    If Not @error Then
    $folder_array[0]=UBound($folder_array)
    _ArrayAdd($folder_array,$drive&"\"&$folder_id)
    EndIf

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

    $folder_dect_under=FileFindFirstFile($folder_array[$x]&"\*.")
    If $folder_dect_under = -1 Then
    If $x=UBound($folder_array)-1 Then ExitLoop
    $x=$x+1
    ContinueLoop
    EndIf

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

    While 1
    $folder_id_under=FileFindNextFile($folder_dect_under)
    If @error Then
    $x=$x+1
    ExitLoop
    EndIf
    $folder_array[0]=UBound($folder_array)
    _ArrayAdd($folder_array,$folder_array[$x]&"\"&$folder_id_under)
    WEnd
    FileClose($folder_dect_under)

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

    WEnd
    FileClose($folder_dect)
    Return $folder_array
    EndFunc

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

    Func drive_search_file($drive="C:",$file_type="*.*")
    $drive=StringReplace($drive,"\","")
    $get_drive=DriveGetDrive("All")
    For $i=1 To $get_drive[0]
    If $drive = $get_drive[$i] Then ExitLoop
    If $i=$get_drive[0] Then Return 0
    Next

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

    Local $folder_search=drive_search_folder($drive),$type_array[1]
    $folder_search[0]=UBound($folder_search)
    _ArrayInsert($folder_search,1,$drive)
    For $i=1 To $folder_search[0]
    $type_search=FileFindFirstFile($folder_search[$i]&"\"&$file_type)
    If @error Then ContinueLoop

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

    While 1
    $type_next=FileFindNextFile($type_search)
    If @error Then ExitLoop

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

    $type_array[0]=UBound($type_array)
    _ArrayAdd($type_array,$folder_search[$i]&"\"&$type_next)
    WEnd
    FileClose($type_search)
    Next
    _ArraySort($type_array, 0, 1, 0, 0)
    Return $type_array
    EndFunc

    [/autoit]
  • Hm,

    und wenn du dir erstmal alle Files auflisten lässt FileFindFirstFile("*") und die dann selbst überprüfst? Ist natürlich nicht so effizient wie deine Methode, sollte aber bei nicht allzuvielen Dateien keine so große Rolle spielen.

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • @funkey

    das ist mir auch aufgefallen.
    aber in meinem fall ist "drive_search_folder" nur mittel zum zweck.
    ich hab auch schon überlegt dazu neue functions zu schreiben (filefindnextfile) aber wie, hat jemand ansätze??


    Autoit scheint Buggy zu sein

  • Nur für Ordner ist meine Funktion schneller ;)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    FileChangeDir('C:\')

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

    $start = TimerInit()
    $ret1 = _GetFilesFolder_Rekursiv('.', '*', 1)
    $diff1 = TimerDiff($start)

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

    $start = TimerInit()
    $ret2 = _GetAllFolders('C:')
    $diff2 = TimerDiff($start)

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

    ConsoleWrite($diff1 & @CR)
    ConsoleWrite($diff2 & @CR)

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

    _ArrayDisplay($ret1, "_GetFilesFolder_Rekursiv")
    _ArrayDisplay($ret2, "_GetAllFolders")

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

    Func _GetAllFolders($sPath = @HomeDrive)
    ;funkey 04.12.2009
    Local $line, $aFolder
    Local $cmd = 'dir /ad /b /s "' & $sPath & '\"'
    Local $Pid = Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE, 2)
    While 1
    $line &= StdoutRead($Pid, 0, 0)
    If @error Then ExitLoop
    WEnd
    $aFolder = StringSplit($line, @CRLF, 3)
    ReDim $aFolder[UBound($aFolder) - 1]
    For $i = 0 To UBound($aFolder) - 1
    $aFolder[$i] = _OEMToAnsi($aFolder[$i])
    Next
    Return $aFolder
    EndFunc ;==>_GetAllFolders

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

    Func _OEMToAnsi($sOEM)
    Local $a_AnsiFName = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
    If @error = 0 Then $sAnsi = $a_AnsiFName[2]
    Return $sAnsi
    EndFunc ;==>_OEMToAnsi

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]