Änderung von Dateien mitloggen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Tach zusammen,

ich möchte gerne mit einem Pythonscript mitloggen ob sich etwas an den Files in einem Ordner ändert.
Ich will wissen ob ein File gelöscht, hinzugefügt oder geändert wird.
Außerdem will ich wissen von wem das File und wann das File geändert wurde und was mit diesem File gemacht wurde.
Habt ihr vielleicht eine Idee?
Dankbar für jede Hilfe. :D


Gruß
Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Da gibt's unter Linux den FAM-Daemon mit Python-Modul (FaileAccessMonitor). Das Teil hatte aber arge Probleme bekommen als wir einen ganzen Verzeichnisbaum überwachen wollten. Unsere Lösung war ein periodischer "find"-Aufruf.

cu beyond
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Danke aber wie soll das dann in Windows funktionieren.
Und wie kann ich erkennen was an der Datei geändert worden ist?
Und welcher User das war?
Und wie kann ich einen Drucker wählen?
Ich weiß viele Fragen.
Hat jemand ne Antwort?

Need help. :?:
Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Vielleicht zeichnet zumindest NTFS evtl. ein paar Daten auf, wer wann eine Datei geändert hat?!?
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Tach noch ma.

Hat niemand ne Idee wie ich das Problem lösen könnte?
Ist das überhaupt mit Python für Windows machbar?

Gruß
Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Windows ist nicht meins ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Im Python Cookbook habe ich etwas gefunden. Das geht scheinbar auch mit Windows.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

:D Dank dir Leonidas das war genau das was ich gesucht habe.
Das File ist die perfekte Plattform um mein Script aufzubauen.


Gruß
Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Kann mir mal jemand sagen wo ich bei dem Script aus dem Pythoncookbook den Ordner angebe der durchsucht wird?

Dankbar für jede Hilfe

Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Is nicht der erste Parameter der übergeben wird die Liste der Verzeichnisse die durchsucht werden?

Gruß, mawe
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Aber im Script habe ich nirgendwo paths wiedergefunden.
Path gibt es aber nicht paths.
Muss es dann ca. so aussehen?

Code: Alles auswählen

def watch_directories (paths = "C:/....." , func, delay = 1.0):
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Zeile 59:

Code: Alles auswählen

for path in paths:
            ^^^^^
Letzte Zeile:

Code: Alles auswählen

watch_directories(['.'], f, 1)
Der . ist das aktuelle Verzeichnis, also schreibst dort statt dem Punkt Dein Verzeichnis bzw. Deine Verzeichnisse :wink:

Gruß, mawe
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

War schon am verzweifeln.
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Habe es ausprobiert aber es kommt die Fehlermeldung

Code: Alles auswählen

TypeError: watch_directories() takes at least 2 arguments (0 given)
Ne Ahnung was das heißt?

Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Zu wenige Argumente beim Funktionsaufruf. Zeig mal wie Du die Funktion aufgerufen hast.

Gruß, mawe
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Hier ist mein kompletter Quelltext.

Code: Alles auswählen

from Tkinter import *
import sys
import tkFileDialog
import tkSimpleDialog
import os,time

FolderToScan = None
EmailAdress = None

def ChangeFolder():
 FolderToScan = tkFileDialog.askdirectory()

def EmailAdress():
    Subwindow1 = Tk() 
    Subwindow1.geometry("200x100+0+0")
    Label1= Label(Subwindow1, text = "E-Mailadress :")
    Label1.place(x = 5, y = 10)
    EmailAdress = Entry(Subwindow1, width=30)
    EmailAdress.place(x = 5, y = 35)
    Subwindow1.mainloop()

def ChangeLogFolder():
 FolderToSaveLog = tkFileDialog.askdirectory()


def watch_directories (paths , func, delay = 1.0):
    all_files = {}

    def f (unused, dirname, files):

        for filename in files:
            path = os.path.join(dirname, filename)

            try:
                t = os.stat(path)

            except os.error:
                continue
            mtime = remaining_files.get(path)

            if mtime is not None:
                del remaining_files[path]
                if t.st_mtime > mtime:
                    changed_list.append(path)

            else:
                changed_list.append(path)
            all_files[path] = t.st_mtime
    rescan = False

    while true:
        changed_list = []
        remaining_files = all_files.copy()
        all_files = {}

        for path in paths:
            os.path.walk(path, f, None)
        removed_list = remaining_files.keys()

        if rescan:
            rescan = False

        elif changed_list or removed_list:
            rescan = func(changed_list, removed_list)
        time.sleep(delay)

    if _name_ == '_main_':

        def f (changed_files, removed_files):
            print changed_files
            print 'Removed', removed_files
        watch_directories([FolderToScan], f, 1)

        
Mainwindow = Tk()
Mainwindow.geometry("400x200+0+0")

#Logo = PhotoImage(file ="I:\Groups3\ELE HW\SYSTEMS_BENCH\PRAK\Patrick Waibel\Projekte\Projekt Folder Scanner\logo.jpg")
#Label2 = Label(image = Logo).pack()

RunScriptButton = Button(Mainwindow, text = "Run script", bg = "green", width = 25, height = 2, command = watch_directories)
RunScriptButton.place(x = 25, y = 30)

StopScriptButton = Button(Mainwindow, text = "Stop script",bg = "red", width = 25, height = 2, command = sys.exit)
StopScriptButton.place(x = 215, y = 30)

ChangeFolderButton = Button(Mainwindow, text = "Change folder to scan", width = 25, command = ChangeFolder)
ChangeFolderButton.place(x = 25, y = 100)

ChangeMailAdressButton = Button(Mainwindow, text = "Change mailadress", width = 25, command = EmailAdress)
ChangeMailAdressButton.place(x = 215, y = 100)

ChangeLogButton = Button(Mainwindow, text = "Change destination of logfile", width = 25, command = ChangeLogFolder)
ChangeLogButton.place(x = 25, y = 150)

del FolderToScan

mainloop()
Gruß
Psus82

Edit (Leonidas): Code in Python-Tags gesetzt.
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Na gut, schaun wir mal:

Code: Alles auswählen

....
def ChangeFolder():
    global FolderToScan   # Du erzeugst hier sonst eine neue lokale Variable mit gleichem Namen
    FolderToScan = tkFileDialog.askdirectory() 
....
while True:   # nich true 
...
#if _name_ == '_main_':  # unnötig
# auf die Einrückung achten, def f ist auf der selben Ebene wie def watch_directories
def f (changed_files, removed_files):
      print changed_files
      print 'Removed', removed_files
#watch_directories([FolderToScan], f, 1)  # unnötig

Code: Alles auswählen

RunScriptButton = Button(Mainwindow, text = "Run script", bg = "green", width = 25, height = 2, 
    command = watch_directories)
Hier rufst Du eigentlich watch_directories auf, und wie Du siehst: ohne Argumente :wink:
Schreibs so:

Code: Alles auswählen

RunScriptButton = Button(Mainwindow, text = "Run script", 
    bg = "green", width = 25, height = 2, 
    command = lambda: watch_directories[FolderToScan],f,1])
Gruß, mawe
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Hey danke noch mal für die schnelle Hilfe werde die Änderungen ausprobieren.

:D

Greetz
Psus82
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
Psus82
User
Beiträge: 128
Registriert: Dienstag 6. April 2004, 16:15

Beim RunscriptButton wird mir eine invalid Syntax angezeigt.
Liegt das am ] ?
Und def f muss genau unter def watch_directories liegen?
Erstes def f oder zweites?
Drei Dinge die Programmierer hassen:
1.)Sonnenlicht
2.)Frische Luft
3.)Das ätzende Geräusch zwitschernder Vögel
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Bevors zu kompliziert wird, hier mal der Code so wie er bei mir funktioniert:

Code: Alles auswählen


from Tkinter import *
import sys
import tkFileDialog
import tkSimpleDialog
import os,time

FolderToScan = None
EmailAdress = None

def ChangeFolder():
    global FolderToScan
    FolderToScan = tkFileDialog.askdirectory()

def EmailAdress():
    Subwindow1 = Tk()
    Subwindow1.geometry("200x100+0+0")
    Label1= Label(Subwindow1, text = "E-Mailadress :")
    Label1.place(x = 5, y = 10)
    EmailAdress = Entry(Subwindow1, width=30)
    EmailAdress.place(x = 5, y = 35)
    Subwindow1.mainloop()

def ChangeLogFolder():
	FolderToSaveLog = tkFileDialog.askdirectory()


def watch_directories (paths , func, delay = 1.0):
    all_files = {}

    def f (unused, dirname, files):

        for filename in files:
            path = os.path.join(dirname, filename)

            try:
                t = os.stat(path)

            except os.error:
                continue
            mtime = remaining_files.get(path)

            if mtime is not None:
                del remaining_files[path]
                if t.st_mtime > mtime:
                    changed_list.append(path)

            else:
                changed_list.append(path)
            all_files[path] = t.st_mtime
    rescan = False

    while True:
        changed_list = []
        remaining_files = all_files.copy()
        all_files = {}

        for path in paths:
            os.path.walk(path, f, None)
        removed_list = remaining_files.keys()

        if rescan:
            rescan = False

        elif changed_list or removed_list:
            rescan = func(changed_list, removed_list)
        time.sleep(delay)

def f (changed_files, removed_files):
    print changed_files
    print 'Removed', removed_files
       
Mainwindow = Tk()
Mainwindow.geometry("400x200+0+0")

RunScriptButton = Button(Mainwindow, text = "Run script", bg = "green", width = 25, height = 2, 
	command = lambda:watch_directories([FolderToScan],f,1))
RunScriptButton.place(x = 25, y = 30)

StopScriptButton = Button(Mainwindow, text = "Stop script",bg = "red", width = 25, height = 2, command = sys.exit)
StopScriptButton.place(x = 215, y = 30)

ChangeFolderButton = Button(Mainwindow, text = "Change folder to scan", width = 25, command = ChangeFolder)
ChangeFolderButton.place(x = 25, y = 100)

ChangeMailAdressButton = Button(Mainwindow, text = "Change mailadress", width = 25, command = EmailAdress)
ChangeMailAdressButton.place(x = 215, y = 100)

ChangeLogButton = Button(Mainwindow, text = "Change destination of logfile", width = 25, command = ChangeLogFolder)
ChangeLogButton.place(x = 25, y = 150)

del FolderToScan

mainloop()
Gruß, mawe
Antworten