#cs
#include <array.au3>
;~ _ArraySort($array)
$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
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
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") & '"')
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