Seite 1 von 2

Änderung von Dateien mitloggen?

Verfasst: Mittwoch 1. Dezember 2004, 15:21
von Psus82
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

Verfasst: Mittwoch 1. Dezember 2004, 23:18
von Beyond
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

Und bei Windows?

Verfasst: Dienstag 7. Dezember 2004, 14:09
von Psus82
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

Re: Und bei Windows?

Verfasst: Dienstag 7. Dezember 2004, 14:13
von jens
Vielleicht zeichnet zumindest NTFS evtl. ein paar Daten auf, wer wann eine Datei geändert hat?!?

Niemand ne Idee?

Verfasst: Mittwoch 8. Dezember 2004, 14:31
von Psus82
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

Verfasst: Mittwoch 8. Dezember 2004, 16:32
von Beyond
Windows ist nicht meins ...

Verfasst: Mittwoch 8. Dezember 2004, 17:35
von Leonidas
Im Python Cookbook habe ich etwas gefunden. Das geht scheinbar auch mit Windows.

Danke!!

Verfasst: Dienstag 14. Dezember 2004, 15:48
von Psus82
:D Dank dir Leonidas das war genau das was ich gesucht habe.
Das File ist die perfekte Plattform um mein Script aufzubauen.


Gruß
Psus82

????

Verfasst: Freitag 14. Januar 2005, 15:41
von Psus82
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

Verfasst: Freitag 14. Januar 2005, 15:44
von mawe
Hi!

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

Gruß, mawe

Du meinst paths?

Verfasst: Freitag 14. Januar 2005, 15:49
von Psus82
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):

Verfasst: Freitag 14. Januar 2005, 15:57
von mawe
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

Thanks a lot.

Verfasst: Freitag 14. Januar 2005, 15:59
von Psus82
War schon am verzweifeln.

Habs ausprobiert.

Verfasst: Freitag 14. Januar 2005, 16:07
von Psus82
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

Verfasst: Freitag 14. Januar 2005, 16:14
von mawe
Hi!

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

Gruß, mawe

Der komplette Quelltext.

Verfasst: Freitag 14. Januar 2005, 16:16
von Psus82
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.

Verfasst: Freitag 14. Januar 2005, 16:33
von mawe
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

Besten Dank.

Verfasst: Freitag 14. Januar 2005, 16:35
von Psus82
Hey danke noch mal für die schnelle Hilfe werde die Änderungen ausprobieren.

:D

Greetz
Psus82

Der zeigt mir eine invalid Syntax an.

Verfasst: Freitag 14. Januar 2005, 16:48
von Psus82
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?

Verfasst: Freitag 14. Januar 2005, 16:54
von mawe
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