Benötige Unterstützung bei Fileread rekursiv

  • Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

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

    $log= @TempDir & "\test_dummy.txt"

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

    get_file_list()

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

    Func get_file_list()
    Dim $file_dir=""
    If Not FileExists("c:\msi-setup") Then
    MsgBox(0,"Fehler","MSI File wurde nicht entpackt.")
    Exit
    Else
    If FileExists("c:\test.file") Then FileDelete("c:\test.file")
    RunWait(@ComSpec & " /c dir c:\msi-setup /A:D /B /s >> c:\test.file","",@SW_HIDE)

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

    _FileReadToArray("c:\test.file", $file_dir)
    _ArraySort($file_dir)

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

    For $j=1 to UBound($file_dir,1)-1

    If Not FileExists($file_dir[$j] & "\*\") Then FileWriteLine($log,"##### " & $file_dir[$j]) ; ich möchte hier nur die Ordner festhalten, welche keine Unterordner und nur Dateien beinhalten

    $FileList=_FileListToArray($file_dir[$j],"*",1)
    ;~ If Not @Error=1 Or @error=4 Then ProgressOn (StringTrimLeft($file_dir[$j],12), "Bitte haben Sie etwas Geduld.....", "")

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

    _ArraySort($FileList)

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

    For $i=1 to UBound($FileList,1)-1

    If StringLeft($file_dir[$j],28) <> "c:\msi-setup\System32\Redist" Then

    If FileExists($file_dir[$j] & "\" & $FileList[$i]) Then
    $a=$file_dir[$j] & "\" & $FileList[$i]
    $a0=FileGetSize($a)
    $a1=FileGetVersion($a)
    $a2=FileGetSize($a)
    $a3=FileGetTime($a)
    $a4=FileGetTime($a,1)
    ;~ FileWriteLine($log,$FileList[$i] & "|" & $a1)
    FileWriteLine($log,$FileList[$i] & "|" & $a0 & "|" & $a1 & "|" & $a2 & "|" & $a3[2] & "." & $a3[1] & "." & $a3[0] & "-" & $a3[3] & ":" & $a3[4] & "|" & $a4[2] & "." & $a4[1] & "." & $a4[0] & "-" & $a4[3] & ":" & $a4[4])
    Else
    EndIf
    ;~ $percent=UBound($fileList,1)/100
    ;~ ProgressSet( $i/$percent , $i & " von " & UBound($FileList,1)-1 & " Dateien gefunden")
    Else
    EndIf

    Next
    ;~ ProgressOff()
    Next
    EndIf
    EndFunc]

    [/autoit]


    Hallo ich habe ein / zwei Fragen, kann man das Script noch optimieren, es benötigt so ca. ~20 sec. bei ~4000 Dateien.
    Oder ist das OK auf einem Notebook (mit 5400 Umdrehungen)
    Wie kann ich es erreichen das nur der Ordnername der Dateinamen beinhaltet aufgeschrieben wird?
    Beispiel:
    ####msi-setup\1
    ####msi-setup\1\2
    ####msi-setup\1\2\3\datei*.* ich möchte nur diesen Ordnernamen haben für die Schleife / Liste

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    Einmal editiert, zuletzt von Dietmar (23. März 2009 um 20:23)

  • Moin,

    Spoiler anzeigen
    [autoit]

    If FileExists("C:\test.txt") Then _
    FileDelete("C:\test.txt")

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

    RunWait(@ComSpec & " /c dir c:\Programme\AutoIt3 /A:-D /B /s >> C:\test.txt","",@SW_SHOW)

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

    ShellExecute ("C:\test.txt")

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


    LG
    Greenhorn


  • ja so bekomme ich alle Dateien.
    Ich hatte allerdings bewusst D statt -D genommen um die den Pfadnamen schon einmal zu haben für Trenner zwischen den Dateien.
    Und um eine Liste für die äußere Schleife zu haben. ;) der Pfad wird ja auch im Progress angezeigt.

    Die dateileeren Verzeichnisse sind auch nicht so problematisch, da kann ich mit leben.
    gibt es eine bessere Lösung um an die Infos je Datei zu kommen.
    Wirkt für mich ein bissel doppelt gemoppelt ;)

    Der Vorteil bei -D es ist schneller müsste dann nur ein bissel umbauen, allerdings wie lange gibt es dir noch :)
    Aber die file2array Geschichte von Bugfix finde ich schon etwas schwer überschaubar, für mich :)

    Ergebnis:
    XXTT.jpg: Version - 1583 ist identisch
    XXXX.jpg: Version - 1426 ist identisch
    ##### C:\WINDOWS\system
    ! Fehler: msxml4.dll-4.20.9818.0 nicht vorgefunden.
    ! Fehler: msxml4a.dll-4.10.9404.0 nicht vorgefunden.
    ! Fehler: msxml4r.dll-4.10.9404.0 nicht vorgefunden.
    ##### C:\WINDOWS\system32
    craxdrt.dll: Version - 8.5.0.473 ist identisch
    craxdrt_res_de.dll: Version - 8.5.0.217 ist identisch

    sieht dann nach einem Vergleich dann so aus. Früher wurde in der Schleife wo die Version abgefragt wird auch die Version der Zieldatei nach Installation geprüft.
    Jetzt will ich das aber so zerrupfen das ich mir die Referenzdatei erstelle entweder beim Setup und anschliessendem Vergleich.
    Oder nur Datei erzeugen und am anderen PC gegen ein setup /a Verzeichnis prüfen bzw gegen die Installation.
    Halt ein Script mit Parametern so das es mit Proress laufen kann aber auch unbeaufsichtigt zur Dateigenerierung in den Setuperzeugungsprogress eingebunden werden kann.

    Hier die Schleife wie es schon produktiv lief, ich will es nun um ein paar Werte erweitern :S

    [autoit]


    Func compare_dir()
    If Not FileExists("c:\msi-setup") Then
    MsgBox(0,"Fehler","MSI File wurde nicht entpackt.")
    my_exit()
    Else
    FileDelete("c:\test.file")
    RunWait(@ComSpec & " /c dir c:\msi-setup /A:D /B /s >> c:\test.file","",@SW_HIDE)
    FileWriteLine($log,"########################################################################")
    FileWriteLine($log,"# Vergleich der Dateien aus dem MSI-File und inststallierten Dateien. #")
    FileWriteLine($log,"# #")
    FileWriteLine($log,"# Wenn keine Version ermittelt werden kann, wird die Größe verglichen. #")
    FileWriteLine($log,"#----------------------------------------------------------------------#")

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

    _FileReadToArray("c:\test.file", $file_dir)
    _ArraySort($file_dir)

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

    For $j=1 to UBound($file_dir,1)-1
    $dir=_StringSplit($file_dir[$j], '\', 1)
    If $dir[2]="common" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "common",@CommonFilesDir)
    If $dir[2]="program files" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "program files",@ProgramFilesDir)
    If $dir[2]="system" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "system",@WindowsDir & "\system")
    If $dir[2]="system32" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "system32",@WindowsDir & "\system32")
    If $dir[2]="windows" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "windows",@WindowsDir)

    FileWriteLine($log,"##### " & $search_dir)

    $FileList=_FileListToArray($file_dir[$j],"*",1)
    If Not @Error=1 Or @error=4 Then ProgressOn (StringTrimLeft($file_dir[$j],12), "Bitte haben Sie etwas Geduld.....", "")
    ; MsgBox (0,"","No Files\Folders Found.")
    ; Exit
    ; EndIf

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


    _ArraySort($FileList)

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

    For $i=1 to UBound($FileList,1)-1

    If StringLeft($file_dir[$j],28) <> "c:\msi-setup\System32\Redist" Then

    If FileExists($search_dir & "\" & $FileList[$i]) Then
    $a=FileGetVersion($file_dir[$j] & "\" & $FileList[$i])
    If $a="0.0.0.0" Then $a=FileGetSize($file_dir[$j] & "\" & $FileList[$i])
    $b=FileGetVersion($search_dir & "\" & $FileList[$i])
    if $b="0.0.0.0" Then $b=FileGetSize($search_dir & "\" & $FileList[$i])
    If $a=$b Then
    FileWriteLine($log,$FileList[$i] & ": Version - " & $a & " ist identisch")
    ;MsgBox(0,"OK",$FileList[$i] & ": Version - " & $a & " ist identisch")
    Else
    FileWriteLine($log,"! Fehler: " & $FileList[$i] & " -Versionskonflikt- " & $a & " wird erwartet,Version " & $b & " vorgefunden.")
    ;MsgBox(0,"Fehler:",$FileList[$i] & " -Versionskonflikt- " & $a & " wird erwartet,Version " & $b & " vorgefunden.")
    EndIf
    Else
    FileWriteLine($log,"! Fehler: " & $FileList[$i] & "-" & FileGetVersion($file_dir[$j] & "\" & $FileList[$i]) & " nicht vorgefunden.")
    EndIf
    $percent=UBound($fileList,1)/100
    ProgressSet( $i/$percent , $i & " von " & UBound($FileList,1)-1 & " Dateien verglichen")
    Else
    EndIf

    Next
    ProgressOff()
    Next
    FileWriteLine($log,"########################################################################")
    cleanup()
    EndIf
    EndFunc

    [/autoit]

    Da da nun noch ein paar werte zukommen überlege ich wie ich nun möglichst fix (in der Ausführung) die Inhalte vergleiche.
    Referenzliste in mehrdim. Array einlesen und dann Datei für Datei einlesen und dabei Version, etc gegen die Werte aus der Arrayzeile prüfen.
    Wie bekomm ich die Name,Version,Date1,Date2,Size in einen Datensatz damit ich die einzeln wieder nutzen kann.
    Oder gibt es noch bessere Vorschläge um ein solch Log erzeugen, ich möchte kein file diff von 2 Dateien ;) da auch Registry etc im finalen Log ausgewertet wird...

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    6 Mal editiert, zuletzt von Dietmar (23. März 2009 um 22:02)

  • Hat keiner eine Idee, einen Tip was man beachten sollte, damit das ganze noch etwas performant läuft?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o