Vergleichen von HDD-Inhalten

  • Hi jungs :)
    ich habe ein problem :( und zwar möchte ich für eine AG in der schule ein programm schreiben, welches den inhalt der Festplatte mit einem vorherigen speicherstand vergleicht.
    Also irgendwann wird der speicherstand aktualisiert und wenn man später checkt ob er noch gleich ist soll er mir die pfade der dateien ausspucken die fehlen bzw neu dazu gekommen sind.

    im moment erkennt er zwar wenn die inhlate nichtmehr übereinstimmen, aber wenn ich versuche die inhalte mit StringReplace von einander "abzuziehen" dann spuckt er eine rießige liste aus :(

    hoffe ihr könnt mir helfen

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <_GetFilesFolder_Rekursiv.au3>
    #include <Array.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 766, 553, 268, 309)
    $Button1 = GUICtrlCreateButton("Durchsuchen...", 56, 464, 219, 57, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Go", 488, 472, 219, 57, $WS_GROUP)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 729, 433)
    GUICtrlSetData(-1, "Edit1")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad = FileSelectFolder("Pfad aussuchen","")
    if $pfad <> "" Then
    GUICtrlSetData($Edit1,'"'&$pfad&'" wurde ausgewählt')
    $string = _GetFilesFolder_Rekursiv($pfad,-1,0,1)
    $text = GUICtrlRead($Edit1)
    GUICtrlSetData($Edit1,$text&@CRLF&"Daten wurden in das Array eingelesen."&@CRLF)
    IniWrite("C:\speicher.ini","1","string",$string)
    IniWrite("C:\speicher.ini","2","pfad",$pfad)
    EndIf
    Case $Button2
    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten werden verglichen...")
    $string2 = _GetFilesFolder_Rekursiv($pfad,-1,0,1)
    if $string==$string2 Then
    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten stimmen überein!")
    Else
    If StringCompare($string,$string2) > 0 Then
    $file = StringReplace($string2,$string,"")
    Else
    $file = StringReplace($string,$string2,"")
    EndIf
    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten stimmen NICHT überein!"&@CRLF&$file&@CRLF)
    EndIf

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

    EndSwitch
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo,
    habe dein Script ausprobiert , funktioniert soweit....die hinzugekommenen Dateien werden in der Liste angezeigt! Allerdings solltest du noch doppelte CRLF entfernen, damit keine störenden Leerzeilen entstehen.
    Weiterhin funktioniert das ganze auch nur dann, wenn die Verzeichnisordnung nicht verändert wurde. Stringreplace kann nur zusammenhängende Strings ersetzen!

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <filelistRekursiv.au3>
    #include <Array.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 766, 553, 268, 309)
    $Button1 = GUICtrlCreateButton("Durchsuchen...", 56, 464, 219, 57, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Go", 488, 472, 219, 57, $WS_GROUP)
    $Edit1 = GUICtrlCreateEdit("", 16, 16, 729, 433)
    GUICtrlSetData(-1, "Edit1")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $file=fileopen("C:\speicher.dat",0)
    $string=fileread($file)

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

    $pfad=filereadline($file,1)
    ;MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$pfad' & @lf & @lf & 'Return:' & @lf & $pfad) ;### Debug MSGBOX

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

    fileclose($file)
    if $string= "" then
    GUICtrlSetData($Edit1,"Keine abgespeicherten Daten vorhanden!"&@crlf)
    endif
    ; MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$string' & @lf & @lf & 'Return:' & @lf & $string) ;### Debug MSGBOX

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

    While 1
    $Msg = GUIGetMsg()
    Switch $Msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $pfad = FileSelectFolder("Pfad aussuchen","")
    if $pfad <> "" Then
    GUICtrlSetData($Edit1,'"'&$pfad&'" wurde ausgewählt')
    $string = _GetFilesFolder_Rekursiv($pfad,-1,0,1)
    $text = GUICtrlRead($Edit1)
    GUICtrlSetData($Edit1,$text&@CRLF&"Daten wurden in das Array eingelesen."&@CRLF)
    filedelete("C:\speicher.dat")
    filewrite("C:\speicher.dat",$pfad&@crlf&$string)

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

    EndIf
    Case $Button2
    if $pfad<>"" then
    $file=$string
    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten werden verglichen...")
    $string2 = _GetFilesFolder_Rekursiv($pfad,-1,0,1)
    if $string==$string2 Then
    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten stimmen überein!")
    Else
    $array=stringsplit($string2,@crlf,3)
    for $zeile in $array
    if stringinstr($string,$zeile)<>0 then ;wenn datei in der speicher.dat vorhanden, dann aus der liste löschen

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

    $file = stringreplace($file,$zeile&@crlf,"") ;casesense nötig?!

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

    else ;ansonsten an die Liste anhängen
    $file&=@crlf&$zeile&" Datei wurde hinzugefügt"

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

    endif
    next

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

    GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Daten stimmen NICHT überein!"&@CRLF&$file&@CRLF)
    EndIf
    endif
    EndSwitch
    WEnd

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (13. Dezember 2009 um 14:46)

  • Nochmal ne frage :) und zwar, wenn ich das ganze mit iniread und iniwrite mache, dann ist ja das limit der .ini sehr schnell erreicht.
    also habei ch versucht das ganze mit filewrite und read zu machen... die speicher.dat in der die einträge gespeichert sind, hat um die 7000 einträge, welche jeweils in eine einzelne zeile geschrieben werdenn. nun wollte ich versuchen diese in einem array zu speichern :( leider funktioniert das nicht so wie ich wollte, sondern das programm hängt sich auf.
    ps: in zeile 1 steht die zahl der einträge

    Hier ein teil des codes

    [autoit]

    $file = FileOpen("C:\speicher.dat",0)
    global $string1 [FileReadLine($file,1)]
    For $i=1 To FileReadLine($file,1)
    $string1[$i]=FileReadLine($file,$i)
    Next
    FileClose($file)
    _ArrayDisplay($string1)

    [/autoit]


    include ist natürlich schon gemacht :)