Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: اساسيات مراقبة الملفات مع gio  (Read 542 times)

Striky

  • Helping Freak
  • Administrator
  • Posting Freak
  • *****
  • Posts: 252
    • View Profile
    • WWW
    • Email
اساسيات مراقبة الملفات مع gio
« on: August 27, 2009, 08:00:49 AM »
هنتكلم النهاردة عن اساسيات مراقبة الملفات -الأحداث الخاصة بيها زى انشاء ، تغيير ، حذف من خلال GIO/FileMonitor .. العملية بسيطة بس مش لقيت اى snippet جاهزة توضحه فعلى كل حال

الimports
Code: [Select]
import sys, os
from os.path import exists, isfile, isdir
import gio
import gtk

gio عشان فيها ال monitoring
gtk عشان ال mainloop
isfile, isdir لتحديد نوع المراقبة هل بنراقب مجلد او ملف ؟
exists لنتأكد من وجود المسار


Code: [Select]
class GIOFileMonitor(object):
   
    def __init__(self, path=None):
            self.monitors = {}
            self.add_path(path)

هنا عندنا 
1- هو monitors وفيه بنضيف ref لكل monitor –عشان نحافظ على وجودها
2- ميثود بإسم add_path معرفة كالتالى

Code: [Select]
    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 المعرفة كالتالى
Code: [Select]
    def on_changed(self, mon, file, otherfile, event): 
        print file, otherfile, event

انواع ال events
Code: [Select]
>>> 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
Code: [Select]
gfm=GIOFileMonitor("/home/ahmed/Desktop")

وابدا ال main loop
Code: [Select]
gtk.main()

المثال كامل
Code: [Select]
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



« Last Edit: September 08, 2009, 08:20:33 PM by Ahmed Youssef »
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/