مراقبة نظام الملفات FileSystemWatcher - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : مراقبة نظام الملفات FileSystemWatcher (/showthread.php?tid=5122) |
مراقبة نظام الملفات FileSystemWatcher - RaggiTech - 05-10-12 كاتب الموضوع : samerselo
توفر لك الأداة FileSystemWatcher إمكانية مراقبة مجلد أو شجرة مجلدات بحيث تحصل على تنبيهات عندما يحصل أي شئ بداخلها فمثلا عندما يتم إنشاء أو حذف أو إعادة تسمية مجلد أو ملف أو عندما تتغير خصائص مجلد ما حيث تعتبر هذه الأداة ذات فائدة في العديد من الظروف فإذا كنت تقوم بعمل برنامج يقوم بتشفير الملفات آليا عندما يتم تخزينها في مجلد معين فبدون هذه الأداة سيتوجب عليك استطلاع ذلك المجلد على فترات زمنية محددة – عادة باستخدام الـ Timer – ولكن هذه الأداة تسهل عليك هذا الأمر. وممكن أن تكون هذه الأداة مفيدة عندما تقوم بتخزين ملف بيانات في الذاكرة لتسهيل الوصول إليه بسرعة ولكنك تحتاج لإعادة تحميله في الذاكرة إذا قام برنامج آخر بتغيير محتوياته.تعريف التحكم FileSystemWatcher يمكنك إنشاء التحكم FileSystemWatcher بإحدى طريقتين إما عن طريق الكود أو بسحبها من شريط الأدوات إلى النموذج من خلال مصمم النماذج ولا يوجد أي اختلاف في الأداء بينهما فيمكنك استخدام أي طريقة تفضلها وإنشاؤه عن طريق الكود يتم بسهولة كود : ' Use WithEvents to be able to trap events from this object. فالخاصية Path تحدد مسار المجلد الذي ترغب بمراقبته لاحظ أنه سيتم إعلامك بالتغييرات داخل المجلد وليس بالتغييرات على خصائصه والخاصية IncludeSubdirectories يجب ضبطها إلى False إذا كنت ترغب بإعلامك بالتغييرات داخل ذلك المجلد فقط أو إلى True إذا كنت ترغب بمراقبة كامل لشجرة المجلد بحيث يكون جذرها هو المجلد المحدد بالخاصية Path والخاصية Filter تمكنك من تحديد ما هي الملفات التي تهمك فاستخدام *.* يجعلك تراقب جميع الملفات بينما استخدام *.txt يجعلك تراقب الملفات التي تملك اللاحقة txt فقط والقيمة الافتراضية لهذه الخاصية هي Null وهي تطابق *.* والخاصية NotifyFilter مرمزة على مستوى البت bit-coded بحيث يمكنك تحديد تشكيلة من واحد أو أكثر من قيم مرقمة enumerated كـ Attributes و CreationTime و DirectoryName و FileName و LastAccess و LastWrite و Security و Size و القيمة الافتراضية لها هي LastWrite Or FileName Or DirectoryName ففي هذه الحالة لن تتلقى تنبيهات عندما تتغير الخصائص وإليك مثال عن كيفية تعريف تحكم FileSystemWatcher من أجل التغييرات في شجرة المجلد C:\Windows كود : Dim WithEvents fsw As New FileSystemWatcher() بعد أن تكون قد عرفت هذا العنصر بصورة صحيحة ستحصل على التنبيهات فور حدوث أي شئ حيث يمكنك تفعيل ذلك بمعالجة الأحداث أو باستخدام الطريقة WaitForChange وأبسط طريقة للحصول على التنبيهات من FileSystemWatcher هي بكتابة معالجات للأحداث الخاصة بهذا العنصر ولكن هذه الأحداث لن تنطلق حتى تقوم بضبط الخاصية EnableRaisingEvents إلى True و تستقبل الأحداث Created و Deleted و Changed البارامتر FileSystemEventArgs الذي يعرض خاصيتان هامتان Name اسم الملف الذي وقع عليه الحدث و FullPath مسار ذلك الملف الكامل كود : Private Sub fsw_Created(ByVal sender As Object, _ كود : Private Sub fsw_All(ByVal sender As Object, ByVal e As FileSystemEventArgs) _ كود : Private Sub fsw_Renamed(ByVal sender As Object, ByVal e As RenamedEventArgs) _ يطلق FileSystemWatcher حدث مستقل لكل حدث يقع على ملف ما فعلى سبيل المثال إذا حذفت 10 ملفات ستتلقى 10 أحداث بحيث يكون لكل ملف الحدث الخاص به وكذلك إن قمت بنقل 10 ملفات من مجلد لآخر ستتلقى 10 أحداث حذف و 10 أحداث إنشاء الطريقة WaitForChanged إذا كان برنامجك لا يقوم بعمل أي شئ سوى انتظار التغييرات في مجلد معين أو أنك تقوم بمراقبة تغييرات الملفات من مسار ثانوي Secondary Thread يمكنك كتابة كود أبسط وأكثر فاعلية باستخدام الطريقة WaitForChanged وهي متزامنة Synchronous أي أنها لا تعود حتى يحدث تغيير ما أو ينتهي الوقت المحدد timeout وعندما تعود هذه الطريقة يستقبل البرنامج النتيجة عبر التركيب WaitForChangedResult Structure الذي تمكنك خصائصه من تحديد فيما إذا انتهت المدة أو أن حدث ما قد وقع واسم الملف المتعلق بالحدث كود : ' Create a *new* FileSystemWatcher component with values from كود : ' Pause the application until the c:\temp\temp.dat file is deleted. كود : Private Sub fsw_Error(ByVal sender As Object, ByVal e As ErrorEventArgs) _ معالجة المشاكل في الحالة الافتراضية فأحداث FileSystemWatcher يتم تنفيذها على مسار مأخوذ من بركة مسارات النظام System thread pool وبما أن تحكمات Windows Forms ليست أمنة للمسارات not thread safe لذلك يجب أن لا تحاول الوصول إلى أي تحكم أو حتى النموذج نفسه من داخل أحداث التحكم FileSystemWatcher وإن وجدت هذا التصرف غير مقبول فعليك تمرير تحكم Windows Forms للخاصية SynchronizingObject كالمثال كود : ' Use the Form object as the synchronizing object. وفيما يلي بعض الأفكار المفيدة عند التعامل مع التحكم FileSystemWatcher وبعض المشاكل التي قد تحتاج لحلها عندما تقوم باستخدامه - يقوم التحكم بالبدء بإطلاق الأحداث عندما تكون الخاصية Path غير فارغة والخاصية EnableRaisingEvents مضبوطة إلى True كما يمكنك منعه من إطلاق الأحداث خلال طور التحميل للنموذج بتضمين أوامر التهيئة الخاصة بك بين العبارتين BeginInit و EndInit كما يفعل مصمم النماذج الخاص بفيجوال ستوديو - في بعض الحالات قد تستقبل عدة أحدث إنشاء للملف اعتمادا على الطريقة التي يتم إنشاء الملف بها فمثلا عندما تقوم بإنشاء ملف باستخدام المفكرة Notepad ستلاحظ سلسلة من الأحداث Created و Deleted و Created و Changed - التغيير في ملف يولد أيضا حدث إضافي في المجلد الأب أيضا لأن المجلد يحافظ على معلومات حول الملفات الموجودة داخله - إذا كان المجلد المحدد كقيمة للخاصية Path تمت إعادة تسميته فإن التحكم FileSystemWatcher يستمر بالعمل بصورة صحيحة ولكن في هذه الحالة يستمر التحكم بإعادة الاسم القديم للمجلد وبالتالي قد تحصل على خطأ عند استخدامه وهذا يحدث بسبب أن التحكم يتعامل مع مقبض المجلد الذي لا يتغير بتغيير اسم المجلد - إذا أنشأت مجلد ضمن المجلد الذي تتم مراقبته وكانت الخاصية IncludeSubdirectories مضبوطة على True فستتم مراقبة المجلد الجديد أيضا - عندما يتم إنشاء ملف كبير ضمن المجلد فقد لا تستطيع قراءة كامل الملف مباشرة لأنه يكون ما يزال مملوكا من قبل العملية Process التي قامت بكتابة البيانات إلى ذلك الملف ويجب عليك حماية الكتابة إلى الملف الأصلي باستخدام حلقة Try فإن تم إطلاق خطأ يمكنك محاولة العملية بعد بضع ميلي ثانية أخرى - عندما يقوم المستخدم بحذف ملف في مجلد فإن ملفا جديدا سيتم إنشاؤه في مجلد سلة المحذوفات RecycleBin مراقبة نظام الملفات FileSystemWatcher - RaggiTech - 05-10-12 كاتب المشاركة : جهاد العريقي
موضوع اكثر من رائع ..جزاك الله خير استاذ محمد سامر .. ولي إضافة بسيطة يجب علينا عمل Imports لفضاءالاسماء IO او يمكن ان نكتب الكود الاتين اقتباس: [TABLE="width: 100%"] [TR] [TD="class: alt2"]Dim WithEvents fsw As New FileSystemWatcher() [/TD] [/TR] [/TABLE] كالاتي كود : [color=#000000][COLOR=#0000bb]Dim WithEvents fsw [/color][color=#007700]As New [/color][color=#0000bb]IO[/color][color=#007700].[/color][color=#0000bb]FileSystemWatcher[/color][COLOR=#007700]() |