هنتكلم النهاردة عن اساسيات مراقبة الملفات -الأحداث الخاصة بيها زى انشاء ، تغيير ، حذف من خلال GIO/FileMonitor .. العملية بسيطة بس مش لقيت اى snippet جاهزة توضحه فعلى كل حال
الimports
import sys, os
from os.path import exists, isfile, isdir
import gio
import gtk
gio عشان فيها ال monitoring
gtk عشان ال mainloop
isfile, isdir لتحديد نوع المراقبة هل بنراقب مجلد او ملف ؟
exists لنتأكد من وجود المسار
class GIOFileMonitor(object):
def __init__(self, path=None):
self.monitors = {}
self.add_path(path)
هنا عندنا
1- هو monitors وفيه بنضيف ref لكل monitor –عشان نحافظ على وجودها
2- ميثود بإسم add_path معرفة كالتالى
def add_path(self, path):
if exists(path):
monitor = None
f=gio.File(path)
if isdir(path):
monitor=f.monitor_directory( gio.FILE_MONITOR_NONE)
elif isfile(path):
monitor=f.monitor_file(gio.FILE_MONITOR_NONE)
if monitor is not None:
monitor.connect("changed", self.on_changed)
self.monitors[path] = monitor
هنا الفكرة اننا نستدعى monitor_directory او monitor_file حسب نوع المسار سواء مجلد او ملف
ملحوظة: دا فى حال عدم وجود الميثود monitor اللى بتخمن تلقائى وتعيد الmonitor المناسبة
لاحظ انت ممكن تمرر FLAGS ليهم زى مامذكور
gio.FILE_MONITOR_WATCH_MOUNTS عشان تراقب احداث الضم .. فى حال عدم اهميتها استخدم FILE_MOUNTER_NONE
فيجيلنا monitor object فنضيفه فى ال self.monitors ك value لمفتاح بيعبر عن المسار
ونربط الchanged signal بالميثود on_changed المعرفة كالتالى
def on_changed(self, mon, file, otherfile, event):
print file, otherfile, event
انواع ال events
>>> filter(lambda x: 'EVENT' in x.upper(), dir(gio))
['FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED', 'FILE_MONITOR_EVENT_CHANGED', 'FILE_MONITOR_EVENT_CHANGES_DONE_HINT', 'FILE_MONITOR_EVENT_CREATED', 'FILE_MONITOR_EVENT_DELETED', 'FILE_MONITOR_EVENT_PRE_UNMOUNT', 'FILE_MONITOR_EVENT_UNMOUNTED', 'FileMonitorEvent']
بس كدا انشئ object
gfm=GIOFileMonitor("/home/ahmed/Desktop")
وابدا ال main loop
المثال كامل
import sys, os
from os.path import exists, isfile, isdir
import gio
import gtk
class GIOFileMonitor(object):
def __init__(self, path=None):
self.monitors = {}
self.add_path(path)
def add_path(self, path):
if exists(path):
monitor = None
f=gio.File(path)
if isdir(path):
monitor=f.monitor_directory( gio.FILE_MONITOR_NONE)
elif isfile(path):
monitor=f.monitor_file(gio.FILE_MONITOR_NONE)
if monitor is not None:
monitor.connect("changed", self.on_changed)
self.monitors[path] = monitor
def on_changed(self, mon, file, otherfile, event):
print file, otherfile, event
gfm=GIOFileMonitor("/home/ahmed/Desktop")
gtk.main()
راجع الوثائق لمزيد من المعلومات
http://library.gnome.org/devel/pygobject/stable/class-giofile.html