1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • FileListToArray im gesamten Verzeichnisbaum aber nicht rekursiv

    • Oscar
    • 2. Februar 2011 um 14:22

    Irgendwas stimmt nicht so ganz. Ich habe gerade mal die beiden Funktionen auf mein Systemlaufwerk "c:\" losgelassen (mehrmals, damit der Cache benutzt wird):

    Iterativ: ca. 19 sek, Ergebnis: 280736 Dateien/Verzeichnisse
    Rekursiv: ca. 9 sek, Ergebnis: 276358 Dateien/Verzeichnisse

    Vom Geschwindigkeitsunterschied her kommt das Deiner Messung mit der SSD recht nahe, aber die rekursive Funktion unterschlägt hier einige Dateien/Verzeichnisse. Welche kann ich nicht sagen, habe die Ergebnisse nicht im einzelnen verglichen. :D
    Meine eigene rekursive Funktion liefert aber auch 280736 Ergebnisse, von daher muss in Deiner rekursiven Funktion ein Fehler stecken. Kann es sein, dass die statische Variable diese Probleme verursacht?

    Allerdings benötigt meine rekursive Funktion auch nur etwas über 9 sek. Im Vergleich zu Deiner iterativen ist sie also ca. doppelt so schnell. Bei kleineren Verzeichnisbäumen zieht Deine iterative Funktion aber gnadenlos an meiner vorbei.
    Das heißt, Deine iterative Funktion hat noch Probleme mit großen Verzeichnisbäumen. :huh:

  • FileListToArray im gesamten Verzeichnisbaum aber nicht rekursiv

    • Oscar
    • 1. Februar 2011 um 19:13

    Mangels SSD kann ich das leider nicht testen.
    Aber merkwürdig finde ich das von Dir beschriebene Verhalten bei der SSD schon. 3x so schnell entbehrt irgendwie jeder Logik. :huh:

  • FileListToArray im gesamten Verzeichnisbaum aber nicht rekursiv

    • Oscar
    • 1. Februar 2011 um 18:41

    Das kann ich so nicht bestätigen. Bei mir (Win7, 64Bit) ist die iterative Funktion schneller.

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $iTimer = TimerInit()
    $Array = FLwStr(@ScriptDir, '', 3, 0)
    ConsoleWrite(TimerDiff($iTimer) & @CR)
    _ArrayDisplay($Array)

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

    $iTimer = TimerInit()
    $Array = FlwStrRek(@ScriptDir, '', 3, 0)
    ConsoleWrite(TimerDiff($iTimer) & @CR)
    _ArrayDisplay($Array)

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: FLwStr()
    ; Description ...: Findet Dateien und/oder Ordner in einem Verzeichnisbaum
    ; Syntax ........: FLwStr($sSD, Const[ $sPat = '', Const[ $iF = 3]])
    ; Parameters ....: $sSD - Suchort (mehrere Suchorte durch | trennen)
    ; Const $sPat - [optional] regulärer Ausdruck für zu findende Datei/Ordnernamen (default:'')
    ; Const $iF - [optional] 1=nur Dateien, 2=nur Ordner, 3=Dateien+Ordner (default:3)
    ; Const $iSSFlag - [optional] 0=Rückgabearray mit Anzahl Elemente in $Array0, 2=Rückgabearray ohne Anzahl Elemente
    ; Return values .: Success - Return Array with Matches with $Array[0] = Count
    ; Failure - Return "" and set @error
    ; Author ........: AspirinJunkie
    ; Remarks .......: Funktionsweise ist iterativ - nicht rekursiv
    ; Example .......: Yes
    ; #include <Array.au3>
    ; $aTmp = FLwStr(@WindowsDir & '|' & @ProgramFilesDir, "^Temp$", 2)
    ; _ArrayDisplay($aTmp)
    ; =================================================================================================
    Func FLwStr($sSD, Const $sPat = '', Const $iF = 3, Const $iSSFlag = 0)
    ;by AspirinJunkie
    Local $sRet = "", $sSubD = ""
    For $i In StringSplit($sSD, '|', 2)
    If StringRight($i, 1) = '\' Then $i = StringTrimRight($i, 1)
    If Not FileExists($i) Then Return SetError(2, 0, "")
    $sSubD &= '|' & $i
    Next
    Local $FFFF, $FFNF, $sDir, $iC
    Local $aD, $hDLL = DllOpen('kernel32.dll')
    If Not ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(3, 0, "")
    Do
    $iC = StringInStr($sSubD, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubD) - $iC
    $sDir = StringRight($sSubD, $iC)
    $sSubD = StringTrimRight($sSubD, $iC + 1)
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $sDir & '\' & $FFNF & '\|'
    $aD = DllCall($hDLL, 'dword', 'GetFileAttributesW', 'wstr', $sDir & '\' & $FFNF)
    If @error And BitAND($aD[0], 0x400) Then ContinueLoop
    $sSubD &= '|' & $sDir & '\' & $FFNF
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $sDir & '\' & $FFNF & '|'
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Until 0
    DllClose($hDLL)
    Return StringSplit(StringTrimRight($sRet, 1), '|', $iSSFlag)
    EndFunc ;==>FLwStr

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: FLwStrRek
    ; Description ...: Gibt ein Array mit Dateien bzw. Unterordnern im gesamten Verzeichnisbaum zurück
    ; Syntax.........: FLwStrRek($sSD, [$sPat = '*', [$iF = 0]])
    ; Parameters ....: $sSD - Startverzeichnis (mehrere Verzeichnisse durch | trennen)
    ; $sPat - Optional: Pattern zur Filterung mit regulären Ausdrücken
    ; $iF - Optional: Flag ob nur Dateien, Ordner oder beides gesucht werden sollen
    ; |$iF=3(Default) Gibt beides zurück
    ; |$iF=1 Gibt nur Dateien zurück
    ; |$iF=2 Gibt nur Ordner zurück
    ; $flgSS - Art der Rückgabe (Siehe StringSplit()-Funktion)
    ; $bS - interner Rekursionsparameter - nicht verändern!
    ; Return values .: @Error: 1 = Startverzeichnis existiert nicht.
    ; |2 = ungültiger Wert für $iF
    ; Author ........: AspirinJunkie
    ; Modified.......: 12.04.2010
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; Note ..........: basiert auf einem rekursiven Ansatz
    ; ===============================================================================================================================
    Func FlwStrRek($SSD, Const $sPat = "", Const $iF = 3, Const $flgSS = 2, Const $bS = True)
    ; By AspirinJunkie
    Local $FFFF, $FFNF, $aD
    Local Static $sRet, $hDll
    If $bS Then
    $hDll = DllOpen("kernel32.dll")
    If NOT ($iF = 3 Or $iF = 1 Or $iF = 2) Then Return SetError(1, DllClose($hDll), "")
    EndIf
    For $I In StringSplit($SSD, "|", 2)
    If StringRight($I, 1) = "\" Then $I = StringTrimRight($I, 1)
    If Not FileExists($I) Then ContinueLoop
    $FFFF = FileFindFirstFile($I & "\*")
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    If BitAND(StringRegExp($FFNF, $sPat) * 2, $iF) Then $sRet &= $I & "\" & $FFNF & "|"
    $aD = DllCall($hDll, "dword", "GetFileAttributesW", "wstr", $I & "\" & $FFNF)
    If @error Or BitAND($aD[0], 1024) Then ContinueLoop
    FlwStrRek($I & "\" & $FFNF, $sPat, $iF, 2, False)
    ElseIf BitAND(StringRegExp($FFNF, $sPat), $iF) Then
    $sRet &= $I & "\" & $FFNF & "|"
    EndIf
    Until 0
    FileClose($FFFF)
    EndIf
    Next
    If $bS Then
    DllClose($hDll)
    Local $aRet = StringSplit(StringTrimRight($sRet, 1), "|", $flgSS)
    $sRet = ""
    Return $aRet
    EndIf
    EndFunc ;==>FlwStrRek

    [/autoit]

    @ScriptDir ist bei mir ein Verzeichnis, in dem sich insgesamt 2196 Dateien/Verzeichnisse befinden (viele Unterverzeichnisse).
    Ich habe das obige Script mehrmals gestartet und stets ist die iterative Funktion schneller. Nicht viel (60 ms statt 67 ms), aber immerhin. :)

  • FileListToArray im gesamten Verzeichnisbaum aber nicht rekursiv

    • Oscar
    • 1. Februar 2011 um 18:00

    AspirinJunkie: Wow! Die Funktion ist klasse! :thumbup:
    Wahnsinnig schnell und berücksichtigt gleich auch die ReparsePoints. Das ist jetzt mein Favorit. Gleich mal archivieren...

  • adlerkalle stellt sich vor

    • Oscar
    • 1. Februar 2011 um 16:42

    Herzlich willkommen hier im Forum!

    [Thread verschoben nach Uservorstellung]

  • WinGetClientPos

    • Oscar
    • 1. Februar 2011 um 16:36

    Großvater, danke für die Funktion! :thumbup:
    Wird gleich mal archiviert.

  • Fehler finden

    • Oscar
    • 1. Februar 2011 um 16:31

    Die Fehlermeldung grenzt das Problem aber schon ein wenig ein, denn sie besagt ja, dass eine Action mit einem Object fehlerhaft war.
    Musst Du halt nachsehen, wo werden Objectaufrufe durchgeführt und wo könnte dort der Fehler versteckt sein?
    Meistens passieren diese Fehlermeldungen, wenn es ein Object unter dem entsprechenden Betriebssystem nicht gibt. Das heißt: Als erstes würde ich mal klären, was für ein Betriebssystem derjenige verwendet.
    Dann: Stehen alle verwendeten Objecte auch auf diesem Betriebssystem zur Verfügung?
    Je nachdem, was Du dort verwendest, könnte es auch an einem fehlendem oder fehlerhaften .NET Framework liegen.

  • radiobutton - Group benutzen

    • Oscar
    • 1. Februar 2011 um 16:13

    Hier ist mal ein Beispiel, mit jeweils 3 Radiobuttons (mit Arrays):

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 623, 436, 192, 132)
    Global $aRadioGroup1[4]
    $aRadioGroup1[0] = GUICtrlCreateGroup("Group1", 64, 16, 217, 121)
    $aRadioGroup1[1] = GUICtrlCreateRadio("Radio1", 112, 50, 113, 17)
    $aRadioGroup1[2] = GUICtrlCreateRadio("Radio2", 112, 70, 113, 17)
    $aRadioGroup1[3] = GUICtrlCreateRadio("Radio3", 112, 90, 113, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    Global $aRadioGroup2[4]
    $aRadioGroup2[0] = GUICtrlCreateGroup("Group2", 64, 192, 217, 113)
    $aRadioGroup2[1] = GUICtrlCreateRadio("Radio1", 112, 210, 113, 17)
    $aRadioGroup2[2] = GUICtrlCreateRadio("Radio2", 112, 230, 113, 17)
    $aRadioGroup2[3] = GUICtrlCreateRadio("Radio3", 112, 250, 113, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $aRadioGroup1[1] To $aRadioGroup1[3]
    MsgBox(0, 'Radio', 'Group1, ' & GUICtrlRead($nMsg, 1))
    Case $aRadioGroup2[1] To $aRadioGroup2[3]
    MsgBox(0, 'Radio', 'Group2, ' & GUICtrlRead($nMsg, 1))
    EndSwitch
    WEnd

    [/autoit]
  • Bei GUICtrlCreateListView Spalten verschieden Makieren (zB 1.Spalte links, 5.Spalte rechts)

    • Oscar
    • 31. Januar 2011 um 19:27

    Ich wüsste auch nicht, dass so etwas möglich wäre.
    Du könntest aber etwas tricksen und zwei Listviews nebeneinander erstellen.

    Edit: Mist, Raupi war schneller.

  • WinGetClientPos

    • Oscar
    • 31. Januar 2011 um 18:48

    Raupi hatte seinen Beitrag wieder gelöscht. Dort kann man das Handle des Fensters übergeben.

    Ich habe den Beitrag mal wiederhergestellt. Ich hoffe, Du hast nichts dagegen, Raupi.

  • WinGetClientPos

    • Oscar
    • 31. Januar 2011 um 18:07

    WinGetCaretPos ist das Stichwort:

    [autoit]


    $hGui = GUICreate('Test')
    GUISetState()
    $aWinPos = WinGetPos($hGui)
    ConsoleWrite('WinGetPos = ' & $aWinPos[0] & ', ' & $aWinPos[1] & @CR)
    $aCaretPos = WinGetCaretPos()
    ConsoleWrite('WinGetCaretPos = ' & $aCaretPos[0] & ', ' & $aCaretPos[1] & @CR)

    [/autoit]
  • Programm im Tray beenden und auch Icon "löschen"

    • Oscar
    • 31. Januar 2011 um 16:59

    Benutze statt ProcessClose lieber WinClose. Dann wird auch das TrayIcon verschwinden.

  • [Umfrage beendet][Abgebrochen] Mitlglied des Monats/Quartals/Woche/Jahr/Jahrzents/...

    • Oscar
    • 29. Januar 2011 um 22:39

    Es würde uns schon sehr viel weiterhelfen und die Lesbarkeit Deiner Beiträge erhöhen, wenn Du Dich in Bezug auf Groß-/Kleinschreibung und dem setzen von Satzzeichen etwas mehr anstrengen würdest. :D

  • Download starten bei Firefox?

    • Oscar
    • 29. Januar 2011 um 22:20

    Sowas supporten wir hier auch nicht.
    [closed]

  • [Umfrage beendet][Abgebrochen] Mitlglied des Monats/Quartals/Woche/Jahr/Jahrzents/...

    • Oscar
    • 29. Januar 2011 um 22:11

    Ich bin dagegen! Meine Begründung:
    1. IMHO völlig sinnlos.
    2. Haben wir, gerade um solche Rivalität fernzuhalten, den Postcounter entfernt.
    3. Wird eine solche Abstimmung niemals objektiv sein.
    4. Sollte eine Hilfeleistung aus Spaß an der Sache passieren und nicht, um irgendeinen (zweifelhaften) Titel zu erhalten.

  • Happy Birthday sc4ry

    • Oscar
    • 29. Januar 2011 um 14:24

    Herzlichen Glückwunsch zum Geburtstag! :party:

    Dann feier mal schön! Aber nicht zu dolle... :D

  • Waiter Box

    • Oscar
    • 29. Januar 2011 um 04:18

    Ich wollte nur zeigen, dass sowas auch mit der Standard-MsgBox geht. :)

    Aber bleiben wir beim Thema: Sprenger, Du hast vergessen die GUI am Ende zu löschen. Und man sollte den EventMode auf den MessageLoop-Modus schalten, weil es ja sein kann, dass einer Deine Funktion im OnEventMode benutzen möchte und dann wäre die gleichzeitige Benutzung von GUIGetMsg nicht erlaubt. Ich hab's Dir mal eingefügt:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    _WaitMsgBox("Waiter Box by Sprenger120", "Das ist nur ein kleiner Text meiner Waiter Box. Ein sicherer Schutz gegen DAU's die einfach jedes Fenster zumachen das irgentwo aufpoppt, ohne den Text zu zu lesen.")

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

    Func _WaitMsgBox($sTitle, $sText, $iSeks2Wait = 5, $hParent = 0, $MaxLenght = 50)
    ;By Sprenger120
    Local $iCount = 0, $iLineLenght = $MaxLenght, $iOldEventMode
    $iOldEventMode = Opt('GUIOnEventMode', 0) ; umschalten auf den MessageLoop-Modus (vorherigen Modus in $iOldEventMode)
    If StringLen($sText) < 9 Then
    While StringLen($sText) < 9
    $sText &= " "
    WEnd
    EndIf

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

    $iCount += Int(StringLen($sText / $MaxLenght))
    If Mod($iCount, $MaxLenght) Then $iCount += 1

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

    If $iLineLenght > StringLen($sText) Then $iLineLenght = StringLen($sText)

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

    $iWidth = $iLineLenght * 7
    $iHeight = 10 + ($iCount * 20)

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

    $hWaiterGUI = GUICreate($sTitle, 10 + $iWidth, 40 + $iHeight, -1, -1, BitOR($WS_BORDER, $WS_CAPTION), $WS_EX_TOPMOST, $hParent)

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

    GUICtrlCreateLabel($sText, 5, 5, $iWidth, $iHeight, 0)
    $cButton = GUICtrlCreateButton("OK", $iWidth - 60, $iHeight + 10, 65, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $hWaiterGUI)

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

    $hTimer = TimerInit()
    Do
    Sleep(100)
    GUICtrlSetData($cButton, $iSeks2Wait - Int(TimerDiff($hTimer) / 1000))
    Until TimerDiff($hTimer) > $iSeks2Wait * 1000
    GUICtrlSetState($cButton, $GUI_ENABLE)
    GUICtrlSetData($cButton, "OK")
    While GUIGetMsg() <> $cButton
    WEnd
    GUIDelete($hWaiterGUI) ; hast Du noch vergessen
    Opt('GUIOnEventMode', $iOldEventMode) ; vorherigen Modus wiederherstellen
    EndFunc ;==>_WaitMsgBox

    [/autoit]
  • Waiter Box

    • Oscar
    • 28. Januar 2011 um 21:50

    Schönes Beispiel! :thumbup:
    Es geht aber auch mit der Standard-MsgBox und der Timer-UDF:

    Spoiler anzeigen
    [autoit]


    #include <Timers.au3>

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

    $sMsg = "Das ist nur ein kleiner Text meiner Waiter Box. Ein sicherer Schutz gegen DAU's die einfach jedes Fenster zumachen das irgendwo aufpoppt, ohne den Text zu lesen."
    $hGui = GUICreate('')
    $sTitle = 'Test'
    $iCountTime = 5000 ; mSek
    $iTimer = TimerInit()
    $fCheck = False
    _Timer_SetTimer($hGui, 100, '_Wait')
    MsgBox(0, $sTitle, $sMsg)
    _Timer_KillAllTimers($hGui)

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

    Func _Wait($hWnd, $Msg, $iIDTimer, $dwTime)
    If TimerDiff($iTimer) < $iCountTime Then
    ControlSetText($sTitle, '', '[CLASS:Button; INSTANCE:1]', Int($iCountTime / 1000) - Int(TimerDiff($iTimer) / 1000))
    If Not $fCheck Then
    $fCheck = True
    ControlDisable($sTitle, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    Else
    ControlSetText($sTitle, '', '[CLASS:Button; INSTANCE:1]', 'Ok')
    If $fCheck Then
    $fCheck = False
    ControlEnable($sTitle, '', '[CLASS:Button; INSTANCE:1]')
    EndIf
    EndIf
    EndFunc

    [/autoit]
  • AutoIt Zeit

    • Oscar
    • 28. Januar 2011 um 19:17

    Vielleicht so:

    [autoit]


    $sIniFile = @ScriptDir & '\Blabla.ini'
    $sCheckDate = IniRead($sIniFile, 'Config', 'Date', '00000000')
    If @YEAR & @MON & @MDAY <= $sCheckDate Then Exit MsgBox(0, 'Abbruch', 'Das Programm wurde heute schon gestartet!')
    IniWrite($sIniFile, 'Config', 'Date', @YEAR & @MON & @MDAY)
    MsgBox(0, 'Check ausgeführt', 'Programm startet...')

    [/autoit]
  • Schleife zeitlich beenden??

    • Oscar
    • 28. Januar 2011 um 04:26

    Ganz einfach:

    [autoit]


    $iTimer = TimerInit()
    Do
    Sleep(20)
    Until TimerDiff($iTimer) > 60000 ; <- Wert in Millisekunden

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™