[BITTE TESTEN] Dateisuche auf mehreren Festplatten

  • Hallo Leute,

    vorraussetzung:

    - mehr als eine festplatte

    da ich nur eine festplatte habe:
    ich will testen ob es funktioniert auf mehreren festplatten zu suchen, ich hab das skript mal angehängt und nochmal hier angefügt:

    Zu testendes Skript
    [autoit]

    #include <_Files_list_rekursiv.au3> ;Beinhaltet File.au3 und Array.au3, ist im Archiv dabei

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

    $Festplatten = "C:" & "D:" ;Die Festplatten bitte nicht verändern
    $aDateien = _FilesListRekursiv($Festplatten, 2) ;Bitte auch nicht verändern
    _FileWriteFromArray(@ScriptDir & "\dateien.txt", $aDateien, 1) ;Kann mit _ArrayDisplay ersetzt werden, wenn ihr keine Datei wollt
    ;_ArrayDisplay($aDateien) ;Falls ihr das Array anzeigen wollt und keine Datei haben wollt

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

    ;Bitte postet mir im Thread ob in der Datei bzw. im Array alle Dateien von C: und D: bei euch aufgelistet sind. Wenn nicht trotzdem sagen das es nicht funktioniert. Danke

    [/autoit]
    _Files_list_rekursiv.au3
    [autoit]

    ;#RequireAdmin
    #include-once
    #include <File.au3>
    #include <Array.au3>
    ;==============================================================================================================================#
    ;~ Function Name....: _FilesListRekursiv()
    ;
    ;~ Description......: Auflistung von Dateien
    ;
    ;~ $_a_Pfad_........: Pfad
    ;~ $_Set_Runde_.....: '1' ( Standart ) wie oft die Funktion aufgerufen wird ( beispiel C:\ & D:\ durchsuchen auf 2 setzen )
    ;~ $a_Wildcards_....: '*' ( Standart ) Suchbegrif u. o. Wildcards
    ;
    ;~ Return Value(s)..: Array ( Standard ) mit den gefundenen Dateien Array[0] endhält die anzahl ( Fund )
    ;
    ;~ Author(s)........: Kleiner27 (http://www.autoit.de) # 27.03.2010 09:00 #
    ;==============================================================================================================================#

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

    Local $Runde_
    Local $a_Pfad_
    Local $_x_Files_
    Local $_x_Files_Next_
    Local $_U_ = 0x00000000
    Local $_a_A_Save_[0x000F423F]
    Local $_a_Zaehler_ = 0x00000001
    Local $_Tren_[0x00000003] = [Chr(0x00000020), Chr(0x0000002A), Chr(0x0000005C)]

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

    Func _FilesListRekursiv($_a_Pfad_, $_Set_Runde_ = True, $a_Wildcards_ = True)
    If (StringRight($_a_Pfad_, 0x00000001) <> $_Tren_[0x00000002]) Then $_a_Pfad_ = ($_a_Pfad_ & $_Tren_[0x00000002])
    If ($_Set_Runde_ = $_Tren_[0x00000000] Or $_Set_Runde_ = 0x00000000) Then $_Set_Runde_ = (0x00000001)
    If ($a_Wildcards_ = $_Tren_[0x00000000]) Then $a_Wildcards_ = ($_Tren_[1])
    If ($_U_ < $Runde_) Then ReDim $_a_A_Save_[0x000F423F]
    $_U_ += 0x00000001
    _ShowFilesRekursiv($_a_Pfad_, $a_Wildcards_)
    $Runde_ = ($_U_)
    Switch ($Runde_)
    Case ($_Set_Runde_)
    ReDim $_a_A_Save_[$_a_Zaehler_]
    $_a_A_Save_[0x00000000] = ($_a_Zaehler_)
    $_a_Zaehler_ = 0x00000001
    $_U_ = 0x00000000
    Return ($_a_A_Save_)
    EndSwitch
    Return ($_a_A_Save_)
    EndFunc ;==>_FilesListRekursiv

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

    Func _ShowFilesRekursiv($_a_Pfad_, $a_Wildcards_)
    $_x_Files_ = FileFindFirstFile($_a_Pfad_ & $a_Wildcards_)
    If ($_x_Files_ <> -0x00000001) Then
    Do
    $_x_Files_Next_ = FileFindNextFile($_x_Files_)
    If @error Then ExitLoop
    If (@extended = 0x00000001) Then ContinueLoop
    $_a_A_Save_[$_a_Zaehler_] = ($_a_Pfad_ & $_x_Files_Next_)
    $_a_Zaehler_ += 0x00000001
    Until False
    FileClose($_x_Files_)
    EndIf
    Dim $a_Verzeichnis_ = _FileListToArray($_a_Pfad_, $_Tren_[0x00000001], 0x00000002)
    For $_i_ = 0x00000001 To UBound($a_Verzeichnis_) - 0x00000001
    If (_File_Link_($_a_Pfad_ & $a_Verzeichnis_[$_i_]) = True) Then ContinueLoop
    _ShowFilesRekursiv(String($_a_Pfad_ & $a_Verzeichnis_[$_i_] & $_Tren_[0x00000002]), $a_Wildcards_)
    Next
    EndFunc ;==>_ShowFilesRekursiv

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

    Func _File_Link_($_sF_Link_)
    Dim $_a_K_32_ = DllOpen('kernel32.dll')
    Dim $_D_Array_ = DllCall($_a_K_32_, 'dword', 'GetFileAttributesW', 'wstr', $_sF_Link_)
    If (@error) Then Return SetError(0x00000000, @error, 0x00000000)
    Return BitAND($_D_Array_[0x00000000], 0x00000400) = 0x00000400
    EndFunc ;==>_File_Link_

    [/autoit]

    Skript wurde angehängt einzelnde .au3 und komplettes archiv.

    mfg

  • Bei mir ist keine einzige Datei, da bei mit C & D Laufwerke sind ;)

    Kannst du dann bei C: und D: mit anderen Festplatten ersetzen die du hast? Also z.b. du hast kein C: und D: aber du hast F: und H: dann kannst du C: mit F: ersetzen und D: mit H: aber ohne \ oder so bitte.

  • Zitat

    $Festplatten = "C:" & "D:"
    $aDateien = _FilesListRekursiv($Festplatten, 2)


    Das heißt du sagst der Funktion _FilesListRekursiv dass der Startpfad "C: D:" (Leerzeichen wegdenken - sonst macht er nen Smiley draus) heißt.
    Das ist wirklich so gewollt von dir?

  • Guckt mal in der Beschreibung der UDF. Da Steht das wenn man mehrere Festplatten haben will einfach die hintereinander Schreiben muss und runde auf 2 machen muss. Ich will nur das ihr es testet :(

    Schrubber Versteh ich nicht. Wieso sollte dein PC abschmiern 8|

  • Also die Funktion ist mir der Hex-Schreibweise völlig unlesbar und aus der Beschreibung geht das so für mich auch nicht hervor.

    Du willst einfach nur die alle Dateien von mehreren Verzeichnissen in ein Array lesen? Um das zu testen brauchst du keine 2 Festplatten!
    Für son "Blödsinn" wird hier wohl niemand eine _File_list_rekursiv Funktion auf C:\ loslassen.

  • Ja, ich will mein Suchprogramm auf mehrere Festplatten erweitern. Dabei will ich testen ob es für mehrere Festplatten geht oder nicht. Die Funktion ist nicht von mir, die ist von kleiner27. Und ich glaube genau wegen der Hex-Schreibweise ist es die beste unter den Rekursiven-Dateisuch UDFs.

  • Die Hex-Schreibweise ist eher nachteilig - für den Menschen da es unübersichtlicher wird - und für den Interpreter - da er zur Laufzeit für jede Zahl eine größere Character-Menge auswerten muss.
    Intern kommen eh die selben Zahlen raus.
    Also keine Ahnung wie du darauf kommst das wegen der Hex-Schreibweise die Funktion die beste sein soll.
    Willst du mehrere Verzeichnisse dann geh sie nacheinander durch und papp sie in ein gesamtes Array - wo ist das Problem?

    Wenn du´s wirklich komfortabel willst dann hier mal ein Vorschlag:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $aResult = FLwStr("C:|D:", "", 3)
    _ArrayDisplay($aResult)

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

    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = ""
    For $i in StringSplit($sSD, '|', 2)
    If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then Return SetError(2, 0, "")
    $sSubD &= '|' & $i
    Next
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0],0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|')
    EndFunc

    [/autoit]


    Wenn du es dann auch noch unbedingt mit einem rekursiven Algorithmus gelöst haben willst dann so:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $aResult = FLwStrRek("C:|D:", "", 3)
    _ArrayDisplay($aResult)

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

    Func FLwStrRek($sSD, Const $sPat = '', Const $iF = 3, Const $bS = True)
    ;by AspirinJunkie
    Local $FFFF, $FFNF, $aD
    Local Static $sRet, $hDLL
    If $bS Then
    $hDLL = DllOpen('kernel32.dll')
    $sRet = ''
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    EndIf

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

    For $i In StringSplit($sSD, '|', 2)
    If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then ContinueLoop

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

    $FFFF = FileFindFirstFile($i & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If StringInStr($i & '\' & $FFNF, "\System32") Then ContinueLoop
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $i & '\' & $FFNF & '|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $i & '\' & $FFNF)
    If @error And BitAND($aD[0], 0x400) Then ContinueLoop
    FLwStrRek($i & '\' & $FFNF, $sPat, $iF, False)
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $i & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Next
    If $bS Then
    DllClose($hDLL)
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), '|')
    $sRet = 0
    Return $aRet
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (7. Juli 2010 um 16:14)

  • Das mit den Hex war nur eine Vermutung. Naja dann lauf ich mit ner Schleife durch.

    Mfg

  • Hey.
    Also "C:" & "D:" = "C: D:"
    Versuch doch einfach 2 Suchen hintereinander für C: und dann für D:
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Hab ich doch schon gesagt, ich mach es mit einer For Next schleife, danke an alle :)

  • Hey!


    Wie schon schon die anderen, die Version ist einer der ersten!

    Habe dir ein Beispiel gemacht!

    Drive_List

    Spoiler anzeigen
    [autoit]

    #include 'FileListRekursiv.au3'
    #include <Array.au3>

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

    Local $Drive[3] = ['C:', 'D:', 'F:']
    Local $A, $B, $C, $Z = 0
    Local $iTimer = TimerInit()

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

    For $i = 0 To 2
    $C = ___ArrayAD(_File_List_S_Rekursiv($Drive[$i]), $Drive)
    Next

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

    Func ___ArrayAD($A, $Drive)
    For $i = 1 To UBound($A) - 1
    $B &= '|' & $A[$i]
    Next
    $Z += 1
    If UBound($Drive) = $Z Then Return StringSplit(StringTrimLeft($B, 1), '|')
    EndFunc ;==>___ArrayAD

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

    _ArrayDisplay($C, Round(TimerDiff($iTimer)))

    [/autoit]

    FileListRekursiv

    Spoiler anzeigen
    [autoit]

    ;===================================================================================================================================#
    ;~ Function Name....: _File_List_S_Rekursiv($_Pfad_, $_Wildc_ = '*', $_Flag_ = 0)
    ;
    ;~ Description......: Auflistung von Dateien
    ;
    ;~ $_Pfad_..........: Pfad
    ;~ $Wildc_..........: '*' ( Standart ) Suchbegrif u. o. Wildcards bei Wildcards mit o. suchbegriff $_Flag_ auf '3' setzen es ist auch
    ; möglich mehrere suchbegriffe zu suchen z.B ( *wma,*mp3,*txt ) o. ( wma,mp3,txt ) getrennt mit ','
    ;~ $Flag............: '0' ( Standart ) Datein u. Ordner '1' nur Datein '2' nur Ordner '3' um mit suchbegriffen zu suchen wie (*.txt)
    ;
    ;~ Return Value(s)..: Array ( Standard ) mit den gefundenen Dateien u. o Ordner Array[0] endhält die anzahl ( Fund )
    ;
    ;~ Author(s)........: Kleiner27 (http://www.autoit.de) # 27.03.2010 09:00 #
    ;====================================================================================================================================#

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

    Local $F
    Local $UB
    Local $FN
    Local $RAS
    Local $Verz
    Local $Expan

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

    Func _File_List_S_Rekursiv($Pfad, Const $Wildc = '*', Const $Flag = 0)
    $Pfad = StringRegExpReplace($Pfad, '[\\/]+\z', '\') & '\'
    If Not FileExists($Pfad) Then Return SetError(1, 1, '')
    If StringRegExp($Wildc, '[\\/:><\|]|(?s)\A\s*\z') Then Return SetError(2, 2, '')
    If Not ($Flag = 0 Or $Flag = 1 Or $Flag = 2 Or $Flag = 3) Then Return SetError(3, 3, '')
    If ($RAS <> '') Then $RAS = ''
    _Rekursiv_S_($Pfad, StringReplace(StringReplace($Wildc, '*', ''), ',', '|'), $Flag)
    If Not $RAS Then Return SetError(4, 4, '')
    Return StringSplit(StringTrimLeft($RAS, 1), '|')
    EndFunc ;==>_File_List_S_Rekursiv

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

    Func _Rekursiv_S_($Pfad, $Wildc, $Flag)
    Local $FL
    $F = FileFindFirstFile($Pfad & '*')
    If ($F <> -1) Then
    While True
    $FN = FileFindNextFile($F)
    If @error Then ExitLoop
    $Expan = @extended
    Switch $Flag
    Case 0
    Switch $Expan
    Case 0
    $RAS &= '|' & $Pfad & $FN
    Case 1
    $FL &= '|' & $FN & '\'
    $RAS &= '|' & $Pfad & $FN
    EndSwitch
    Case 1
    Switch $Expan
    Case 0
    $RAS &= '|' & $Pfad & $FN
    Case 1
    $FL &= '|' & $FN & '\'
    EndSwitch
    Case 2
    If ($Expan = 1) Then
    $FL &= '|' & $FN & '\'
    $RAS &= '|' & $Pfad & $FN
    EndIf
    Case 3
    If ($Expan = 1) Then $FL &= '|' & $FN & '\'
    If StringRegExp($FN, $Wildc) Then $RAS &= '|' & $Pfad & $FN
    EndSwitch
    WEnd
    EndIf
    FileClose($F)
    If Not $FL Then Return $FL = '|'
    $Verz = StringSplit(StringTrimLeft($FL, 1), '|')
    $UB = UBound($Verz) - 1
    For $i = 0 To $UB - 1
    $Verz[$i] = $Verz[$i + 1]
    Next
    ReDim $Verz[$UB]
    For $For In $Verz
    If (_F_L_S_($Pfad & $For) = False) Then _Rekursiv_S_($Pfad & $For, $Wildc, $Flag)
    Next
    EndFunc ;==>_Rekursiv_S_

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

    Func _F_L_S_($FLS)
    Dim Static $K32 = DllOpen('kernel32.dll')
    Dim $DA = DllCall($K32, 'dword', 'GetFileAttributesW', 'wstr', $FLS)
    If (@error) Then Return SetError(0, @error, 0)
    Return BitAND($DA[0], 1024) = 1024
    EndFunc ;==>_F_L_S_

    [/autoit]


    Nochmal in einer Zip:


    LG Kleiner