Alle datein eines PC´s auflisten ?

  • Hallo Gemeinde

    Ich habe vor für einen Bekannten ein Script zu schreiben welches alle Dateien (ausser die C:\ Platte) in eine Datei schreibt, und auch in eine weitere Datei zu erstellen in der stehen soll, wie es mit den verschiedenen Platten also besser gesagt deren Freien / Vollen Speicherplatz aussieht.
    Das ganze soll dann per Client abgefragt werden können.

    Jedoch bin ich scheinbar ein wenig zu beschränkt um schon mit dem eigentlich einfachsten Punkt dieser Sache anzufangen nähmlich dem auflisten der Verzeichnisinhalte.
    Mein erster Ansatz war eigentlich filefindfirstfile und filefindnextfile jedoch zeigt er mir nur die dateien des direkten verzeichnisses an, nicht jedoch die unterverzeichnisse / files.

    Vielleicht hatte ja schon mal jemand ähnliches vor (zumindest was die auflistungen anbelangt) und kann mir einen geeigneten Ansatz liefern... ich bin da gerade irgendwie am verzweifeln.


    MfG Eistee


    Das wäre mein bisheriger ansatz allerdings wird beim relevanten Array nur 0 zurückgegeben...


    Spoiler anzeigen
    [autoit]

    ;Von Kenngott Marco (Eistee, AsusExcite)
    ;E-Mail : [email='marco.kenngott@live.de'][/email]
    ;
    ;
    ;

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

    Global $i
    Global $var

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

    $var = DriveGetDrive( "fixed" )
    If NOT @error Then
    MsgBox(4096,"", "Es wurden " & $var[0] - 1& " Laufwerke gefunden")
    For $i = 2 to $var[0]
    MsgBox(1,"Laufwerke ausser C:\ Nr." & $i, $var[$i])
    Next
    EndIf

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

    $test1 = _RecursiveFileListToArray($var[2]& "\", "*.*")

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

    MsgBox(0,"test", $test1[0])

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

    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================

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

    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]


    hmm... hatte grade die Idee das ich evtl. das Array falsch auslese aber so:

    Spoiler anzeigen
    [autoit]

    ;Von Kenngott Marco (Eistee, AsusExcite)
    ;E-Mail : [email='marco.kenngott@live.de'][/email]
    ;
    ;
    ;
    #include <Array.au3>

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

    Global $i
    Global $var

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

    $var = DriveGetDrive( "fixed" )
    If NOT @error Then
    MsgBox(4096,"", "Es wurden " & $var[0] - 1& " Laufwerke gefunden")
    For $i = 2 to $var[0]
    MsgBox(1,"Laufwerke ausser C:\ Nr." & $i, $var[$i])
    Next
    EndIf

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

    $test1 = _RecursiveFileListToArray($var[1]& "\", "*.*")
    $test2 = _ArrayDisplay($test1)

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

    MsgBox(0,"test", $test2[1])

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

    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================

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

    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]


    funktioniert es ebenfalls nicht ich denke ich mache irgendwas falsch... und komm einfach nicht dahinter...

  • Wenn du wirklich vor hast jedes einzelne Verzeichnis inkl. Unterverzeichnisse und Dateien aufzulisten kommt mir als erstes der cmd-Befehl tree in den Sinn:

    Spoiler anzeigen
    Code
    X:\>tree /F


    Kannst ja mal tree /? in die Kommandozeile eingeben und sehen was du alles machen kannst.
    Um an eine Liste der Dateien in einem Ordner zu gelangen ist mir nur der AutoIt Befehl

    Spoiler anzeigen
    [autoit]

    _FileListToArray()

    [/autoit]


    bekannt. Damit müsstest du natürlich immer alle Unterverzeichnisse öffnen und diese wieder auflisten. Für dein zweites Problem gibt es die Befehle

    Spoiler anzeigen
    [autoit]


    DriveSpaceFree()
    DriveSpaceTotal()

    [/autoit]


    Hoffe du kannst damit was anfangen ;)

  • Panikakrobat
    hmm.. vielen dank für die Tipps ;) ähm also der befehl tree gefällt mir sehr sehr gut jedoch scheint er nur ordner strukturen aufzulisten ? und wie ich diesen inhalt in eine .txt schreiben könnte ist mir ebenfalls schleierhaft.... sry hab noch nie wircklich mit cmd gearbeitet.
    Die sache mit drivegetspace usw. ist echt genial !! danke für den Tipp ;)

  • Die Funktion von Aspirinjunkie funktioniert wunderbar. Dein Suchpatter *.* ist schuld. So wie ich das sehe muss das Suchmuster hier mit regulären Ausdrücken angegeben werden oder eben ganz weg lassen, da du sowieso alles auflisten willst.

  • jetzt weiß ich nur nicht wie ich das aus dem array rausbekommen und auflisten kann das einzige was ich in der Hilfe relevant finde wäre arraytostring allerdings wird es damit total unformatiert ausgegeben und ich wüsste nicht wie ich das ändern könnte... weiß da jemand weiter ?

    Spoiler anzeigen
    [autoit]

    ;Von Kenngott Marco (Eistee, AsusExcite)
    ;E-Mail : [email='marco.kenngott@live.de'][/email]
    ;
    ;
    ;
    #include <Array.au3>

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

    Global $i
    Global $var

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

    $var = DriveGetDrive( "fixed" )
    If NOT @error Then
    MsgBox(4096,"", "Es wurden " & $var[0] - 1& " Laufwerke gefunden")
    For $i = 2 to $var[0]
    MsgBox(1,"Laufwerke ausser C:\ Nr." & $i, $var[$i])
    Next
    EndIf

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

    $test1 = _RecursiveFileListToArray($var[2]& "\")
    _ArraySort($test1)

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

    $test2 =_ArrayToString($test1)

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

    FileWrite("test.txt",$test2)

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

    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================

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

    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]


    hmm.. ok hab es jetzt einigermaßen nur stimmt was nicht bei der ausgabe die datei ist total komisch formatiert ....


    Spoiler anzeigen
    [autoit]

    ;Von Kenngott Marco (Eistee, AsusExcite)
    ;E-Mail : [email='marco.kenngott@live.de'][/email]
    ;
    ;
    ;
    #include <Array.au3>

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

    Global $i
    Global $var

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

    $var = DriveGetDrive( "fixed" )
    If NOT @error Then
    MsgBox(4096,"", "Es wurden " & $var[0] - 1& " Laufwerke gefunden")
    For $i = 2 to $var[0]
    MsgBox(1,"Laufwerke ausser C:\ Nr." & $i, $var[$i])
    Next
    EndIf

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

    $test1 = _RecursiveFileListToArray($var[2]& "\")
    _ArraySort($test1)

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

    $test2 =_ArrayToString($test1)

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

    $test3 = StringSplit($test2, "|" & "{tab}")

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

    For $i2 = 1 to $test3[0]
    FileWriteLine("test.txt",$test3[$i2] & @CRLF)
    Next

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

    ;FileWrite("test.txt",$test2)

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

    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================

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

    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]
  • Benutz einfach das hier wenn du das ganze in eine Datei ausgeben willst:

    [autoit]


    _filewritefromarray

    [/autoit]

    Oder du benutzt eben eine GUI zur Anzeige (list oder listview oder auch treeview).

  • Moin,

    du kannst auch die 31. Zeile in deinem Skript so verändern:

    Spoiler anzeigen
    [autoit]

    $test3 = StringSplit($test2, "|", 1)

    [/autoit]


    Dann sollte die Ausgabe eine einheitliche Struktur haben. Das reicht da außer " | " keine Zeichen eine neue Zeile ankündigen.