Kurze Performance Frage oder alternative Lösungen

  • [autoit]

    #cs
    #include <array.au3>
    ;~ _ArraySort($array)

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

    $array = _GetFilesFolder_Rekursiv("f:\MSI-SETUP","*",0)

    [/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

    [/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
    Dim $aFSO = ObjCreate('Scripting.FileSystemObject') ;; warum ist das mit parentfolder und getfileversion so wie geht das richtig
    ;~ IniWrite("c:\array_file_test-ini",$aFSO.GetParentFolder($file.path),$file.Name,'"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & $aFSO.GetFileVersion($file.path) & "|" & FileGetVersion($file.Path,"ProductVersion") & '"')
    IniWrite("c:\array_file_test-ini",StringTrimRight(StringTrimLeft($file.path,12),StringLen($file.name)),$file.Name,'"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & $aFSO.GetFileVersion($file.path) & "|" & FileGetVersion($file.Path,"ProductVersion") & '"')
    $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

    [/autoit]

    ich habe diese Funktion um diesen Block erweitert

    [autoit]

    Dim $aFSO = ObjCreate('Scripting.FileSystemObject')
    FileGetVersion($file.Path,"ProductVersion") & '"')
    IniWrite("c:\array_file_test-ini",StringTrimRight(StringTrimLeft($file.path,12),StringLen($file.name)),$file.Name,'"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & $aFSO.GetFileVersion($file.path) & "|" & FileGetVersion($file.Path,"ProductVersion") & '"')

    [/autoit]

    Vorweg das Ergebnis ist so wie ich es haben möchte, es wird eine datei mit Ini Struktur erstellt

    Zitat

    [\program files\Programmanme\]
    Dateiname="Size|Datum_erzeugt,Datum_modifiziert,Version_File,Version_Produkt"


    nun die Fragen: ;)

    die erste warum kann ich manche nicht mit file.xyz erreichen habe mir da etwas beholfen da ich das mit den Objekten nur am rande verstanden habe und das meine ersten Gehversuche sind würde ich ich mich über Antworten freuen.
    die zweite (eigentlich 1.b) Produktversion lässt sich nicht über oFSO ermittteln ?
    So muss ich die Datei ja 2x in die Hand nehmen, er schrabbelt dann auch mehr auf der HDD rum.

    Und nun zur Performance, bin eigentlich zufrieden es sieht nur irgendwie etws gebastelt aus :)
    IniDatei erzeugen für ~4000 Dateien ~20 sec.
    Nehme ich anstatt $aFSO.GetFileVersion($file.path) // filegetversion(datei,Fileversion) dauert es direkt doppelt so lange ;(
    Es soll / muss ja keine Geschwindigkeitsrekorde aufstellen aber wie man sieht, kann man(ich) doch neh Menge verbocken.
    Im nächsten Step will ich die Files in der INI Datei abarbeiten ala

    1.Schleife (Ordnerwechsel)
    2.Schleife(Dateivergleich)
    if Fileexists Datei aus INI an anderer Stelle then hole Size,Date1,Datei2,Versio1,Version2
    If Stingeigenschaften( Datei1) <> Stingeigenschaften( Such-Datei2) then filewritelog(datei,version...... ) weicht von der erforderlichen ab...

    so in etwa

    Da das nicht an einem Rutsch und die beiden Schritte auch nicht am selben PC passieren müssen,
    ist es besser die INi in ein grosses Array zu lesen und von da abzuarbeiten, oder was ja eigentlich beim Iniread in Häppchen eh passiert OrdnerSection für Section nachlesen.

    Wichtiger noch wie minimiere ich die Lesezugriffe beim Suchen, wie gesagt oFSO ganz neue Baustelle für mich.
    Und es ist wohl spürbar fixer als filegetversion(datei),filegetsize(datei) etc


    Abschliessend kannman es so machen wie in der modifizierten Datei von Bugfix oder hat jemand andere Vorschläge.
    Zum Beispiel das array was bugfix zurückgibt abarbeiten lassen zum Eigenschaften ermitteln.
    aber dann hat die Datei zum dritten mal in der Hand oder ? ?(

    P.S.: Das wird von Hauptprogramm übergeben [$array =] _GetFilesFolder_Rekursiv("f:\MSI-SETUP","*",0)
    Halt ohne [$array =] nur der Funktionsaufruf um die Referenzdatei zu erzeugen.
    im Prinzip brauche ich auch das Rückgabearray nicht zwingend,
    die zusätzlichen Infos aber sehr wohl und das etwas strukturiert, deswegen die IniDatei und nicht den Fileexport statt Array.
    Das klappt ja im Prinzip auch wäre nur schön wenn jemand sagt wie es richtig geht,
    damit ich nicht das performante Script von BugFix von mir zur Schnecke gemacht wird :rofl:

    Achtung Anfänger! :whistling:

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

    4 Mal editiert, zuletzt von Dietmar (8. Juli 2009 um 21:06)

  • Vermutlich zuviel Text für den frühen Abend :D
    Fangen wir mal einfach an, warum geht
    $file.path
    $file.name
    $file.Size
    $file.DateCreated
    $file.DateLastModified

    aber warum geht das nicht analog zu den obigen Einträgen

    $aFSO.GetFileVersion($file.path)

    Das scheint eh ein Sonderfall zu sein

    FileGetVersion($file.Path,"ProductVersion")

    das funktioniert zwar sieht aber irgendwie vermurkst aus :)

    Gruß & Danke Dietmar :rolleyes:

    Achtung Anfänger! :whistling:

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

  • :S Irgendwie vergraule ich immer alle
    Eine weitere Möglichkeit wäre das RückgabeArray zu nutzen, dann das Array erweitern um Spalte 2,3,4,5,6,n
    Dann weiß man auch gleich die Anzahl für z.B. Progress()
    Ist das sinnvoll, was dauert länger Dateiinfos lesen oder in Ini schreiben,
    wäre abschliessend das erweiterte Array in die Ini Schreiben besser?

    Was ist sinnvoller / machbarer?
    Im Prinzip war das Script incl. /Installieren/Inhalt prüfen/Regkeys prüfen/Datenbankupdate usw. schon in Funktion.
    Da wir aber auf eine neuere Installschield Version umstellen verändert sich das Setup im dem Zuge eh.
    Hatte mir sonst eine Ordnerliste mittels DOS geholt und dann direkt verglichen nach dem Setup.
    Da ich den Vorgang splitten möchte und auch die momentane gemischte Logdatei in LOG und Fileliste splitte steht halt die Generealüberholung an.

    Da ich nun nicht nur Versionsnummer und Datum und Größe vergleiche sondern
    beide 2xDatum und beide Versionen wird es auf dem alten Weg echt lahm.

    Ohne Extras ist die Liste in 2 sec mit _arraydisplay zu sehen von daher versuche ich mich da reinzuzecken....
    Besten dank an Bugfix auch wenn ich es noch nicht komplett durchschaut habe, klappt es schon recht gut. Weis nur nicht warum :P

    Achtung Anfänger! :whistling:

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

    Einmal editiert, zuletzt von Dietmar (8. Juli 2009 um 21:43)

  • Tag1.Monolog4

    Ich mach es Euch noch etwas einfacher....

    [ ] Was willst Du hier, du hast ja gar nix verstanden. :rofl:
    [ ] Wir verstehen dein Problem nicht. ?(
    [ ] oFSO ist nicht dein Ding such Dir ein anderes Hobby :D

    Bitte das passende ankreuzen, ich will es ja nicht nur so machen das es funktioniert,
    sondern das es auch inhaltlich stimmig ist.
    Verstehe halt nicht warum ich ein paar Sachen nür über Umwege erreiche.
    Habe übrigens die aktuelle Beta installiert.

    ;) Dietmar

    EDIT:
    So wird es wohl nun bleiben, Am Anfang noch ein Progress(On) am Ende ein Progress(Off)
    und das dazwischengefummelt, Laufzeit ist nun konstant bei ~25sec mit Progress,
    da hat der PC gestern wohl gelegentlich noch was anderes gemacht,seltsam....

    [autoit]


    Else
    IniWrite("c:\array_setup.ini",StringTrimRight(StringTrimLeft($file.path,12),StringLen($file.name)),$file.Name,'"' & $file.Size & "|" & $file.DateCreated & "|" & $file.DateLastModified & "|" & FileGetVersion($file.Path,"FileVersion") & "|" & FileGetVersion($file.Path,"ProductVersion") & '"')
    $cnt_progress = $cnt_progress + 1
    ProgressSet($cnt_progress/40, $cnt_progress & " Dateien ermittelt")
    $strFiles &= $file.Path & $Delim
    EndIf

    [/autoit]


    Das passt nun so auch fürs Auge wieder einigermassen.

    Achtung Anfänger! :whistling:

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

    3 Mal editiert, zuletzt von Dietmar (8. Juli 2009 um 23:21)