Datei abfrage in Minutenintervall

  • Hallo Zusammen,

    ich habe eine Frage: Wie kann ich eine Ini Datei im Minutentakt abfragen, ob neue Datensätze hineingeschrieben werden?


    Hintergrund:

    Ich habe ein Tool geschrieben, dass Datensätze aus einer Ini Datei in eine ComboBox einliest, allerdings nur beim Starten des Tools. Wenn aus der ComboBox ein Wert ausgewählt wird und ein Button gedrückt wird, dann wird der Datensatz aus der Ini gelöscht und in eine andere Ini mit einem anderen Status (z.B. Start eingetragen), dann wird die ComboBox auch aktualisiert.

    Mein Problem ist jetzt allerdings, dass wenn keine Daten mehr in der Ini enthalten sind die ComboBox dementsprechend eine Meldung ausgibt, das keine Daten zum einlesen vorhanden sind.
    Die INi Datei aus der sich diese Combobox die Datensätze holt, wird mit einem anderen Tool erstellt, heist wenn beide Tools offen sind und die Ini wieder einen Datensatz erhält, bekommt das mein Tool mit der ComboBox nicht mit, da die Intervall abfrage fehlt.

    Kann mir vielleicht einer sagen, wie ich eine Intervall abfrage erstellen kann z.B im Minutentakt? Damit würde mir sehr geholfen werden =)

  • Könnte mir vorstellen alternativ mit AdlibRegister zu arbeiten ...

    Hier mal eine einfache Schleife bei der im Minutentakt eine Funktion ausgeführt wird ...

    [autoit]

    While 1
    $MSG = GUIGetMsg()

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

    ;Variante 1
    ;Sleep(60000)
    ;_EineFunktionZumPrüfen()
    ;Variante 2
    If $bTimerActive = False Then
    $iTimer = TimerInit()
    $bTimerActive = True
    EndIf
    If TimerDiff($iTimer) > 60000 Then
    _EineFunktionZumPrüfen()
    $bTimerActive = False
    EndIf

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

    Select
    Case $MSG = $iCombobox
    ; mache irgendwas
    EndSelect

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

    Sleep(100)
    WEnd

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

  • Wenn man dauernd eine Datei abfragt und auf Änderungen vergleicht kann die Festplatte nicht in den Energiesparmodus schalten.
    Cleverer wäre es daher Windows zu sagen: Wenn die Datei geändert werden sollte - benachrichtige mich.
    Konkret kann man das mit den FileSystem-Events umsetzen.

    Hier mal ein Beispiel:

    Auf Änderungen in Datei warten
    [autoit]

    #include <WinAPI.au3>

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

    Global Const $s_Path = FileGetLongName("D:\Test2.ini") ; hier den zu prüfenden Pfad eintragen
    If Not FileExists($s_Path) Then Exit MsgBox(48, "Fehler", "Pfad " & $s_Path & " existiert nicht!")

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

    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)

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

    Global Const $SHCNE_RENAMEITEM = 0x0001 ; Änderung von Dateinamen
    Global Const $SHCNE_CREATE = 0x0002 ; Erstellung von Dateien
    Global Const $SHCNE_DELETE = 0x0004 ; Löschen von Dateien
    Global Const $SHCNE_MKDIR = 0x0008 ; Erstellung von Ordnern
    Global Const $SHCNE_RMDIR = 0x0010 ; Löschen von Ordnern
    Global Const $SHCNE_UPDATEDIR = 0x1000 ; Änderungen in einem Pf ad
    Global Const $SHCNE_UPDATEITEM = 0x2000 ; Änderungen in einer Datei
    Global Const $SHCNE_UPDATEIMAGE = 0x8000
    Global Const $SHCNE_RENAMEFOLDER = 0x20000
    Global Const $SHCNE_ALLEVENTS = 0x7FFFFFFF ; weitere siehe http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx

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

    Global $h_Shell32DLL = DllOpen("shell32.dll")

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

    ; Registriert ein FileSystemEvent mit einer AutoIt-Callback-Funktion
    Global $SHRegister = RegisterFSEvent($s_Path, $SHCNE_UPDATEITEM, EvaluateEvents, False)

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

    ; Erstelle ein Tray-Menü fürs Beenden
    OnAutoItExitRegister("Raus")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "Beenden")

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

    ; Endlosschleife damit AutoIt die meiste Zeit über pausiert ist (Beenden über das Tray-Icon möglich)
    Do
    Sleep(100)
    Until 0

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

    ; Funktion die aufgerufen wird wenn ein Event auftritt:
    Func EvaluateEvents(Const $hWndGUI, Const $MsgID, Const $wParam, Const $lParam)
    Local $h_pidl = DllStructCreate("PTR; PTR", $wParam)
    Local $s_Path = DllCall($h_Shell32DLL, "BOOLEAN", "SHGetPathFromIDListW", "ptr", DllStructGetData($h_pidl, 1), "wstr", "")[2]

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

    Switch $lParam ; Welche Art von Event ist aufgetreten?
    Case $SHCNE_UPDATEITEM ; Wenn ein Element nur vom Inhalt her geändert wurde
    MsgBox(0, "Änderung", "Änderung an folgender Datei festgestellt: " & $s_Path)
    EndSwitch
    ; EndIf
    EndFunc ;==>CheckOfNewFiles

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

    ; registriert ein FileSystemEvent eines Pfades mit einer Funktion
    Func RegisterFSEvent(Const $s_Path, Const $d_Events, Const $cb_CallBackFunc, Const $bRecursive = True)
    Local $h_GUI = GUICreate("")
    Local $h_MyWinMsg = _WinAPI_RegisterWindowMessage("irgendwas")
    GUIRegisterMsg($h_MyWinMsg, $cb_CallBackFunc)

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

    Local $h_PIDLIST = DllCall($h_Shell32DLL, "PTR", "ILCreateFromPathW", "WSTR", $s_Path)
    Local $strct_SHChangeNotifyEntry = DllStructCreate("PTR pidl; BOOLEAN fRecursive")
    $strct_SHChangeNotifyEntry.pidl = $h_PIDLIST[0]
    $strct_SHChangeNotifyEntry.fRecursive = $bRecursive

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

    Local $SHRegister = DllCall($h_Shell32DLL, "int", "SHChangeNotifyRegister", _
    "HWND", $h_GUI, _
    "INT", 0x0003, _
    "LONG", $d_Events, _
    "UINT", $h_MyWinMsg, _
    "INT", 1, _
    "struct*", $strct_SHChangeNotifyEntry)
    DllCall("ole32.dll", "none", "CoTaskMemFree", "ptr", $h_PIDLIST[0])
    Return $SHRegister
    EndFunc ;==>RegisterFSEvent

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

    Func Beenden()
    Exit
    EndFunc ;==>Beenden

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

    Func Raus()
    DllCall($h_Shell32DLL, "BOOLEAN", "SHChangeNotifyDeregister", "ULONG", $SHRegister[0])
    DllClose($h_Shell32DLL)
    EndFunc ;==>Raus

    [/autoit]


    Prinzipiell musst du nur den Pfad $s_Path zu deiner Datei anpassen und in der Funktion EvaluateEvents() hinschreiben was bei einer Änderung passieren soll (momentan kommt nur eine Msgbox).

  • Danke für eure Antworten und eure schnelle Hilfe :)

    @YaeroxXO : Deine erste Varriante, war so einfach, da hätte ich selbst drauf kommen müssen :pinch:
    Deine zweite Varrinate fand ich gut, aber war leider nicht so richtig mit meinem Projekt zukombinieren.

    @ AspirinJunkie: Deine Methode scheint zu funktionieren hab es selbst nicht ausprobiert, weil ich selbst auf eine Lösung gekommen bin. Das die Festplatte nicht in den Ruhemodus geschaltet werden kann ist vollkommen egal.


    Hier noch meine Lösung, im Prinzip wie die von YaeroxXO:

    [autoit]

    If Mod(@MIN, 2) = 0 And $Aktua = 0 Then
    $Aktua = 1
    $First_Time = 0
    ComboBox_Spool_fuellen()
    ElseIf $First_Time = 1 Then
    $First_Time = 0
    ComboBox_Spool_fuellen()
    EndIf

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

    If Mod(@MIN, 2) = 1 Then $Aktua = 0

    [/autoit]


    Ich danke euch =)