





السمعة:
السلام عليكم ورحمة الله وبركاته
أداة مراقبة أحداث الملفات في النظام باستخدام Python !
أداة مراقبة أحداث الملفات في النظام باستخدام Python !
هذه أداة لمراقبة جميع الأحداث التي تحدث للملفات في النظام (ملفات النظام ضمنهم) سواء كان حذف , إنشاء , تعديل , نقل باستخدام لغة بايثون وبدون تعقيد.
المشروع قديم وأنا مو متذكره كويس وماالي نفس أرجع أراجعه كله من جديد وأشرحه وأنا وأتمنى تستفيدوا

تثبيت مكتبة watchdog عبر أمر:
كود:
pip install watchdog

Python:
import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from getpass import getuser
class MonitorHandler(FileSystemEventHandler):
def on_created(self, event):# عندما يتم انشاء ملف
message = f"File created: {event.src_path}"
print(message)
def on_modified(self, event):# عندما يتم تعديل ملف
message = f"File modified: {event.src_path}"
print(message)
def on_deleted(self, event):# عندما يتم حذف ملف
message = f"File deleted: {event.src_path}"
print(message)
def on_moved(self, event):# عندما يتم نقل ملف
message = f"File moved from {event.src_path} to {event.dest_path}"
print(message)
def monitor_directory(path_to_monitor):
if not os.path.exists(path_to_monitor):
print(f"Directory '{path_to_monitor}' does not exist.")
return
event_handler = MonitorHandler()
observer = Observer()
observer.schedule(event_handler, path=path_to_monitor, recursive=True)
print(f"Starting monitoring on: {path_to_monitor}")
observer.start()
time.sleep(0.5) # وقت اختياري للتأكد ان (observer) جاهز للاستخدام
# بدء المراقبة
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
print("Monitoring stopped.")
observer.join()
if __name__ == "__main__":
directory_to_monitor = input("Enter The Target Path To Monitoring It :")" # المسار المستهدف
monitor_directory(directory_to_monitor) # بدء المراقبة

اكتب المسار المراد مراقبته في حقل الإدخال ثم اضغط بدء المراقبة.
Python:
import os
import time
from tkinter import *
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from threading import Thread
class MonitorHandler(FileSystemEventHandler):
def __init__(self, table_object):
super().__init__()
self.table_object = table_object
self.stop_event = False
def on_created(self, event):
self.log_event("تم انشاء ملف", event.src_path)
def on_modified(self, event):
self.log_event("تم تعديل ملف", event.src_path)
def on_deleted(self, event):
self.log_event("تم حذف ملف", event.src_path)
def on_moved(self, event):
self.log_event("تم نقل ملف", f"{event.src_path} to {event.dest_path}")
def log_event(self, event_type, path):
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
self.table_object.add_row([timestamp, event_type, path])
class TableObject:
def __init__(self, master, background_color="#ffffff", font_color="#000000", border_frame_color="#000000" , fill=None, side=None, expand=False):
self.master = master
self.fill = fill
self.side = side
self.expand = expand
self.background_color = background_color
self.font_color = font_color
self.border_frame_color = border_frame_color
self.BorderFrame = Frame(master=self.master, bg=border_frame_color)
self.BorderFrame.pack(pady=1, padx=1, fill=self.fill, side=self.side, expand=self.expand)
self.TableComponentsFrame = Frame(master=self.BorderFrame, bg=self.background_color)
self.TableComponentsFrame.pack(padx=1, pady=1, fill=self.fill, expand=self.expand)
self.TableHeaderFrame = Frame(master=self.TableComponentsFrame, bg=self.background_color)
self.TableHeaderFrame.pack(side=TOP, fill=X, padx=1, pady=1)
self.table_parts = [("الوقت",25), ("الحدث", 20), ("المسار", 40)]
for column_of_the_part, (header_text, width) in enumerate(self.table_parts):
header_label = Label(self.TableHeaderFrame, text=header_text, bg=self.background_color,
fg=self.font_color, font=(None , 14 ) , width=width-5, anchor="w", padx=5)
header_label.grid(row=0, column=column_of_the_part, sticky="nsew", padx=(5, 0))
self.scrollbar = Scrollbar(self.TableComponentsFrame, orient=VERTICAL)
self.TableListBox = Listbox(master=self.TableComponentsFrame , bg=self.background_color , fg=self.font_color , yscrollcommand=self.scrollbar.set,
selectbackground="#cce5ff", selectmode=SINGLE, height=15, width=80, font=("Courier", 10))
self.scrollbar.config(command=self.TableListBox.yview)
self.TableListBox.pack(side=LEFT, fill=BOTH, expand=True)
self.scrollbar.pack(side=RIGHT, fill=Y)
self.TableListBox.bind("<Button-3>", self.show_context_menu)
self.context_menu = Menu(self.TableListBox, tearoff=0)
self.context_menu.add_command(label="Copy", command=self.copy_selected_line)
self.context_menu.add_command(label="Copy All", command=self.copy_all_lines)
def add_row(self, row_data):
formatted_row = ""
for column_of_the_part, (data, (header, width)) in enumerate(zip(row_data, self.table_parts)):
formatted_row += f"{data:<{width}}"
self.TableListBox.insert(END, formatted_row)
def show(self):
self.BorderFrame.pack(pady=1 , padx=1, fill=self.fill, side=self.side, expand=self.expand)
def hide(self):
self.BorderFrame.pack_forget()
def clear_table(self):
self.TableListBox.delete(0, END)
def show_context_menu(self, event):
try:
self.TableListBox.selection_clear(0, END)
self.TableListBox.selection_set(self.TableListBox.nearest(event.y))
self.context_menu.tk_popup(event.x_root, event.y_root)
finally:
self.context_menu.grab_release()
def copy_selected_line(self):
try:
selected_line = self.TableListBox.get(self.TableListBox.curselection())
self.master.clipboard_clear()
self.master.clipboard_append(selected_line)
except TclError:
pass
def copy_all_lines(self):
try:
self.master.clipboard_clear()
for line in self.TableListBox.get(0,END):
self.master.clipboard_append(line+"\n")
except TclError:
pass
def monitor_directory(path_to_monitor, table_object):
if not os.path.exists(path_to_monitor):
print(f"Directory '{path_to_monitor}' does not exist.")
return
event_handler = MonitorHandler(table_object)
observer = Observer()
observer.schedule(event_handler, path=path_to_monitor, recursive=True)
print(f"Starting monitoring on: {path_to_monitor}")
observer.start()
time.sleep(0.5)
try:
while not table_object.stop_event:
time.sleep(0.5)
if table_object.stop_event:
observer.stop()
break
observer.stop()
print("stoped")
if table_object.stop_event :
return
except KeyboardInterrupt:
observer.stop()
print("Monitoring stopped.")
return # exit
observer.join()
background_color = "#00194d"
root = Tk()
root.title("برنامج مراقبة الملفات")
root.geometry("700x400")
root["bg"] = background_color
my_events_table = TableObject(master=root, expand=True, fill=BOTH ,background_color=background_color , font_color="#f1f1f1")
my_events_table.show()
controling_frame = Frame(master=root , bg=background_color)
controling_frame.pack(side=BOTTOM , fill=X)
path_entry = Entry(master=controling_frame , font=(None,12))
def start_monitoring():
my_events_table.stop_event = True
time.sleep(0.6)
monitor_thread = Thread(target=monitor_directory, args=(path_entry.get(), my_events_table), daemon=True)
my_events_table.stop_event = False
monitor_thread.start()
my_events_table.TableListBox.delete(0,END)
start_monitoring_button = Button(master=controling_frame , text=" بدء المراقبة " , font=(None,14) , border=1 , fg="#ffffff" , bg="#0497c2" , activebackground="#004097" , activeforeground="#ffffff" , command=start_monitoring)
start_monitoring_button.pack(side=LEFT , pady=10 , padx=20)
path_entry.pack(side=BOTTOM , fill=X , padx=10 , pady=20)
root.mainloop()
السلام عليكم ورحمة الله وبركاته
التعديل الأخير بواسطة المشرف: