Prüfung einer Datei

  • Hallo zusammen,

    ich suche eine Möglichkeit eine bestimmte Datei auf Veränderung zu Prüfen.

    Ob nun einer veränderte Größe / Datum / Eintragung ... ist im Endeffekt egal.

    Ich habe hierzu ein Code gefunden der aber ab einer bestimmten Größe ein Ereignis auslöst.

    Ich möchte wenn Person X / Programm Y etwas in eine Datei schreibt, dass PC Z eine MSGBOX erhält.

    Vielen Dank vorab.

    Code
    #include <File.au3>
    
    
    $aFiles = _FileListToArray(@ScriptDir & "\Verzeichnis", "*", 1)
    
    
    For $i = 1 To $aFiles[0]
        If FileGetSize(@ScriptDir & "\Verzeichnis\" $aFiles[$i]) > 1024 Then FileDelete(@ScriptDir & "\Verzeichnis\" & $aFiles[$i])
    Next
  • Ich habe hierzu ein Code gefunden der aber ab einer bestimmten Größe ein Ereignis auslöst.

    Ich möchte wenn Person X / Programm Y etwas in eine Datei schreibt, dass PC Z eine MSGBOX erhält.

    ja und warum machst du das nicht? Ich erkenne keine Frage im Thema!

  • Wie genau kann ich das Änderungsdatum / Änderungen der Dateigröße prüfen?!

    Muss ja permanent der Istzustand abgefragt werden, er muss ja irgendwie an die alten Information kommen.

    Vielen Dank vorab.

  • Hi!

    Eines dieser Daten solltest du dir in einer INI oder in der Registry hinterlegen, damit sie dann zur Prüfung herangezogen werden können.

    AutoIt
    Global $iSize = FileGetSize("Pfad der Datei") ; Gibt dir die Grösse der Datei in Bytes an.
    Global $iTime = FileGetTime("Pfad der Datei") ; Gibt zeitbezogene Informationen der Datei an.
    Global $iHash = _MD5ForFile("Pfad der Datei") ; Gibt dir den MD5 Hashwert der Datei an.
    ; Diese Funktion benötigt als Include die WinAPI.au3
    _MD5ForFile

    Je nach dem, wie du die Daten zur Prüfung hinterlegt hast, rufst du sie auf, mit BEINAHE den selben Code. Aufpassen musst du nur bei dem letzten Beispiel mit _MD5ForFile.
    Beim Prüfen musst du dieses durch

    AutoIt
    _Crypt_HashFile("Pfad der Datei", $CALG_MD5)


    ersetzen. Denn es soll ja keine neue Prüfnummer erstellt, sondern diese Nummer abgerufen werden. Das wiederum benötigt aber die Crypt.au3 als Include.

    Letztendlich kommt es dann zur Prüfung.

    AutoIt
    If "originaldaten" <> "geprüfte Datei" Then MsgBox(0,"", "Datei wurde geändert.")
  • Danke Lottich.

    Habe das mal so gut es mir möglich ist probiert.

    Die Testneu beschreibt er wie er soll.

    Irgendwie muss er ja wissen wenn die Datei sich verändert, ich habe in Testalt.ini einfach die Zahl der Größe eingetragen, passiert aber nichts.

    Vielen Dank vorab.

    C
    #include <File.au3>
    #include <WinAPI.au3>
    Global $iSize = FileGetSize("C:\Test\Test.txt") ; Gibt dir die Grösse der Datei in Bytes an.
    FileWrite("C:\Test\Testneu.ini", $iSize) ;Speicherung der Daten in einer Datei
    FileRead("C:\Test\Testneu.ini") ;Lesen der Datei
    FileRead("C:\Test\Testalt.ini") ;Lesen der Datei
    If "Testneu.ini" <> "Testalt.ini" Then MsgBox(0,"", "Datei wurde geändert.")

    Einmal editiert, zuletzt von nwmbd (7. September 2016 um 16:12)

    • Offizieller Beitrag

    Ich möchte wenn Person X / Programm Y etwas in eine Datei schreibt, dass PC Z eine MSGBOX erhält.

    Beschreib mal das Problem genauer!
    Wie viele Rechner sind da beteiligt? Wo liegen die Dateien? Wie viele Personen/Programme greifen da (gleichzeitig?) drauf zu?
    Welcher Rechner soll wann eine MsgBox erhalten? Und was soll da drin stehen?

    Es gibt da nämlich einen schönen Befehl "_WinAPI_ShellChangeNotifyRegister", womit man ein Verzeichnis überwachen kann.

  • Hallo,

    es gibt ein Programm was in die Datei C:\Info.txt Daten ablegt.

    In dieser Datei gibt es zB ein Eintrag "07.09.2016 21:03 Tor 3 geöffnet"

    Ziel ist es das die Datei Info.txt alle 5 Minuten auf neue Einträge geprüft wird, gibt es einen neuen Eintrag, so soll eine MSGBOX "Achtung neuer Eintrag" o.ä. erscheinen.

    Perfekt wäre natürlich, dass nur auf bestimmte Einträge eine MSGBOX erscheint.

    Die Datei sowie das Programm was die Einträge erzeugt sind alle auf dem selben PC.

    Das Problem ist, dass oft vergessen wird das die Tore wieder geschlossen werden.

    Ich möchte über diesen Weg die Person daran erinnern.

    Vielen Dank vorab.

  • Danke an alle, habe es gelöst.

    Finde zwar das dies sicherlich noch viel besser geht, aber es funktioniert zumindest erstmal.

    Er schreit nun aber bei jedem neuen Eintrag, aber er schreit :)

    Ich muss auch noch die Datei irgendwann mal löschen, die wird ja unnötig zugemüllt.

    Einmal editiert, zuletzt von nwmbd (7. September 2016 um 22:25)

  • im 1. Beitrag ) ... ab einer bestimmten Größe ein Ereignis auslöst.
    im 9. Beitrag ) Ich muss auch noch die Datei irgendwann mal löschen, die wird ja unnötig zugemüllt.

    Was für ein Ereignist wird denn ausgelöst und ab welcher Größe wird es ausgelöst?

    Wenn die Datei Dir irgendwann zu groß wird, dann lösch doch X ältere Zeilen. Also wenn Du die neuen Zeilen unten eintragen läßt, löscht Du immer eine Zeile, sobald mehr als z. B. 50 Zeilen vorhanden sind.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Alina,

    ich habe mich doch für das Auslesen des Änderungsdatums entschieden, so funzt es.

    EIgentlich wollte ich die Zeilen der Datei auslesen und nur wenn der neuste Eintrag ein bestimmten Wert (Öffnung Tor 3) enthält wollte ich die MSGBOX ausgeben.

    Nun wird quasi bei jedem Eintrag die MSGBOX ausgegeben, nicht perfekt, aber es geht.

    Nun ist mir aufgefallen das die exe ja auch einfach über den Taskmanager beendet werden kann.

    Aufgrund dieser Tatsache habe ich mir ein ein neuen Code überlegt, ansich funktioniert alles, ich habe aber ein Problem.

    Er prüft bei dem Beispiel ob die Datei da ist, wenn ja ist das Feld Rot, wenn nicht ist es Grün. Ich werde in dem Programm quasi eine Datei erstellen wenn das Programm geschlossen wird/ist.

    Soweit sogut, irgendwie führt er das zwar aus, ändere ich den Dateinamen oder lösche die Datei stimmt es nicht mehr.

    Ich gehe davon aus das er die IF Schleife nachdem die Datei da war und wieder weg ist beendet. Das if quasi nicht mehr gestartet wird, hier kann mir sicherlich sehr leicht geholfen werden :)

    Achja und wenn ich oben das X drücke schließt sich das Programm nicht, hier habe ich sicher Zeilen gelöscht was ich nicht hätte machen dürfen :)

    Könnte man dies auch irgendwie eleganter lösen, ich finde durch das ganze Datei erstellen und löschen etc sehe ich glaube irgendwann nicht mehr durch welche Datei für was zuständig ist.

    Vielen Dank vorab.

    Nachfolgend der Code.

  • Moin nwmbd.

    Was hälst Du denn davon:

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo Alina,

    vielen Dank. Sieht ähnlich aus wie meiner, deine funktioniert aber 1a.

    Hat das etwas mit dem Sleep 30 zutun? Ich habe auf mein ersten Code ein Sleep von 600000 (10 Minuten) nicht das dies dann gar nicht geht?!

    Vielen Dank vorab.

  • Naja. Dann wird nur alle 10 Minuten geprüft, ob eine Taste gedrückt wurde, oder das Fenster geschlossen.
    Sieh dir mal adlibregister an, dort kannst du "nebenher" aufgaben erledigen in bestimmten intervallen.
    Das Sleep in der Hauptschleife sollte nicht über ~100ms sein, guigetmsg hat aber auch ein sleep integriert, weshalb du das hier garnicht benötigst.

  • Vielleicht kannst du ja hiermit etwas anfangen...

    _MonitorDirectory-Demo


    _MonitorDirectory-Demo.png

  • Hallo Bitnugger

    Danke Dir für die Demo und den Hinweis. Tolle Sache. Die Demo wird bei mir leider nur unten im Tray aber nicht auch dem Desktop visualisiert und ich habe keine Ahnung warum. Im Vorschaubild unten im Tray wird es also angezeigt. Ich verwende Win10x64

    Ferner: Gibt es eine Möglichkeit, im Report noch den Benutzeramen vom Verursacher ausgeben zu lassen?

  • Hehe, das liegt daran, weil ich bei mir zum Testen alle GUIs auf meinen zweiten Monitor platziere... :D

    AutoIt
    ; die böse -800
    Global $g_hGUI = GUICreate('_MonitorDirectory-Demo', 600, 430, -800)
    ;
    ; z. B. einfach so ändern...
    Global $g_hGUI = GUICreate('_MonitorDirectory-Demo', 600, 430, -1, -1)

    Ferner: Gibt es eine Möglichkeit, im Report noch den Benutzeramen vom Verursacher ausgeben zu lassen?

    Du kannst dir den User ausgeben lassen (siehe Bild), in dessen Kontext das Script gestartet wurde - z. B. so :

    AutoIt
    MemoWrite(StringFormat('%s %s: %s %s %s', "MonitorDirectory@" & @UserName, $Action, $FilePath, $aPos[0] + 10, $aPos[1] + 10))

    Stichwort: RunAs()

    gibt es auch eine Möglichkeit zu erfassen, wenn Unterverzeichnisse vom überwachten Pfad verschoben werden?

    Ja, die gibt es... siehe Bild.

    PS: Ich habe vorhin erst richtig mitbekommen, was @Kanashius in Post #15 da Feines geschrieben hat... ==> "_WinAPI_ShellChangeNotifyRegister". Die Funktion ist wirklich echt super und sie erledigt mit viel weniger Aufwand dieselbe Arbeit, wie mein Script! ^^ Ich spiele noch damit rum... wenn ich eine kleine Demo fertig habe, schiebe ich sie bei Bedarf gerne hoch.

    _MonitorDirectory-Demo_02.png

    2 Mal editiert, zuletzt von Bitnugger (14. September 2016 um 22:09)

  • Fantastisch. Vielen Dank.


    Ferner: Gibt es eine Möglichkeit, im Report noch den Benutzeramen vom Verursacher ausgeben zu lassen? Edit von Bitnugger erübrigt diese Frage

    und ...

    gibt es auch eine Möglichkeit zu erfassen, wenn Unterverzeichnisse vom überwachten Pfad verschoben werden? Löschen und verschieben von Verzeichnissen wird auch geloogt.

    Einmal editiert, zuletzt von bazii (14. September 2016 um 22:08) aus folgendem Grund: Anpassung an Bitnuggers edit in Posting Nr. 18