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.
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

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:
Letzte Zeile:
Der
. ist das aktuelle Verzeichnis, also schreibst dort statt dem Punkt Dein Verzeichnis bzw. Deine Verzeichnisse
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 
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.
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