الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعاملات متقدمة مع Windows Registry

بدأه محمد رضى في 2 سبتمبر 2009 · 11 رد · 4,321 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله تعالى و بركاته,,,

هذا الموضوع, إن شاء الله, سيكون مخصصا لأكواد التعامل مع Windows Registry. لاحظت مع إصدارات إطار الدوت نت نوعا من الإبتعاد عن تسجيل ويندوز حيث بعد أن كانت عملية تسجيل تكوين البرامج المطورة بـ VB 6 و ماقبلها سهلا و مدعوما على تسجيل ويندوز, نرى أن إصدارات VB.NET تحولت إلى التسجيل على ملف التكوين من نوع XML الذي يحدد عن طريق النافذة Settings. و مع هذا, لا زال تسجيل ويندوز القلب النابض لكل إصدارات نظام التشغيل ويندوز و لا تكاد تطور مشروعا بدون الحاجة إلى تفقد تسجيل ويندوز و قراءة المعلومات منه. لدي تصور لمراحل هذا الموضوع و لكن أفضل عدم الإفصاح عنها الآن. مبدأ الوعد بالقليل لإعطاء الكثير ;)

في هذا الجزء الأول, سنتحدث إن شاء الله عن كيفية البحث داخل Windows Registry. سنتحدث عن طريقة بسيطة لإدماج البحث داخل الويندوز ريجستري على مشروعاتكم. سنبدأ في هذا الجزء الأول مع دوال بسيطة تقوم بعملية البحث. سنطور هذه الدوال في الجزء الثاني إلى فئة قابلة لإعادة الاستعمال في أي مشروع VB.NET. لا أعرف إن كان أحدنا سيحتاج هذا الكود يوما ما في حياته البرمجية لكن أظن أن المعرفة بالشيء خير من الجهل به.

تسجيل ويندوز أو Windows registry هو مستودع مركزي لبيانات نظام التشغيل و البرامج التي تعمل عليه. هذا التسجيل له هيكل هرمي موجه للتصنيف المنطقي للمعلومات المخزنة. محتوى التسجيل منظم على شكل مجلدات و ملفات و بيانات كما هو الحال بالنسبة للبرنامج مستكشف ويندوز. حيث المجلدات هي المفاتيح و الملفات هي أسماء القيم التي تحتوي على البيانات المخزنة. التسلسل الهرمي لتسجيل الويندوز يتمحور على مفاتيح أساسية لكل منها دورها و المعلومات التي تخزنها و يمكن تعريفها كالتالي :

HKEY_CURRENT_USER : جذر مفاتيح معلومات المستخدم الذي تم تسجيل دخوله حاليا. و تحتوي المفاتيح الداخلية على معلومات حول مجلدات المستخدم, إعدادات لوحة التحكم, إعدادات الشاشة و غيرها من المعلومات حساب المستخدم الحالي.

HKEY_USERS : جذر مفاتيح معلومات كل مستخدمي ويندوز الذين لهم حساب على الحاسوب. و كل مفتاح داخلي من المستوى الأول يخص مستخدما منهم.

HKEY_LOCAL_MACHINE : جذر مفاتيح تحوي معلومات التكوين لجهاز الحاسوب. هذه المعلومات مشتركة بين المستخدمين و عامة بالنسبة للحاسوب.

HKEY_CLASSES_ROOT : جذر مفاتيح تحوي مفاتيح لكل نوع من أنواع الملفات المسجلة على نظام التشغيل. هذه المفاتيح تستعمل من طرف مستكشف ويندوز للوصول إلى البرنامج المحرر الافتراضي لنوع الملف المطلوب.

HKEY_CURRENT_CONFIG : جذر مفاتيح تحوي مفاتيح معلومات حول التشكيل الجانبي الحالي للحاسوب.

بعد هذه النبذة الموجزة عن تسجيل ويندوز و قبل البدء في استعراض الكود, لابد من التعرف على البرنامج المرفق. FindReg يقوم بالبحث عن كلمة داخل تسجيل الويندوز. يمكن البرنامج المستخدم من اختيار المفاتيح الجذور التي يتم البحث داخلها. كلما وجد عنصرا كان مفتاحا, قيمة أو اسم لقيمة يقوم بزيادة مسار المفتاح الذي وجد بداخله. يمكن للمستخدم فتح البرنامج regedit.exe على المفتاح المختار من على لائحة العناصر الموجودة أثناء البحث بالنقر مرتين على العنصر من اللائحة أو النقر على الزر ]افتح[. يمكن للمستخدم بدء عملية البحث بالنقر على الزر ]ابحث[ و إيقاف البحث متى شاء بالنقر على الزر ]إيقاف البحث[.

post-207152-1251913589_thumb.jpg

الدالة التي سنقوم بدراستها غير قابلة لإعادة الاستعمال بل معدة فقط للعمل داخل المشروع المرفق و الذي يمثل برنامجا صغيرا للبحث داخل Windows Registry. الدالة FindNext دالة عودية تقوم بالبحث داخل مفتاح عن مفاتيح و قيم و أسماء قيم. فتقوم بالبحث أولا عن القيم و أسماء القيم التي يحتوي عليها المفتاح الذي تم تمريره للدالة للبحث داخله. بعد ذلك تقوم الدالة باستعراض المفاتيح الداخلية و المناداة على نفسها للبحث داخل كل مفتاح موجود داخل المفتاح الذي تم تمريره للبحث فيه. و قبل استعراض الكود, لابد لنا من وقفة مع الكائن RegistryKey. الكائنات من نوع هذه الفئة تمكننا من التعامل مع مفتاح تسجيل ويندوز و محتوياته حيث الخاصية Name تمكننا من الوصول إلى مسار المفتاح. الخاصية SubKeyCount تعطينا عدد المفاتيح الداخلية للمفتاح. الخاصية ValueCount تعطينا عدد القيم التي يحويها المفتاح. الدالة GetSubKeyNames ترجع لنا مصفوفة من كائنات string كل واحدة تمثل اسم مفتاح داخلي. الدالة GetValueNames ترجع لنا مصفوفة من كائنات string كل واحد اسم القيمة التي يمكن أن نمررها إلى الدالة GetValue للحصول على قيمتها. و لا ننسى في الأخير أنه للوصول إلى مفتاح يجب أن نقوم بعملية فتحه بالمناداة على الدالة OpenSubKey و تمرير اسم و مسار المفتاح المراد فتحه و لا ننسى عملية الغلق بعد الفتح حتى لا نتسبب في هدر موارد النظام. الدوال و الخصائص الأخرى سوف نتطرق لها في الأجزاء القادمة إن شاء الله.

فيما يلي كود الدالة FindNext معلق عليه للمزيد من الفهم :

	  '  الدالة التي تبحث داخل مفاتيح الريجيستري
	  ' rkRoot : الذي تبدأ منه عملية البحث RegistryKey كائن من نوع
	  ' path : المسار الذي تبدأ منه عملية البحث
	  Private Sub FindNext(ByVal rkRoot As RegistryKey, ByVal path As String)
		  If path = "" Then Return
		  ' المستخدم أمر بوقف البحث
		  If NeedStop Then Return
		  ' محاولة الوصول إلى المفتاح
		  Dim rk As RegistryKey
		  Try
			  rk = rkRoot.OpenSubKey(path)
		  Catch
			  Return ' لا نتوفر على أذونات للبحث في هذا المفتاح
		  End Try
		  ' المفتاح فارغ
		  If rk Is Nothing Then Return
		  ' إخبار المستخدم بالمفتاح الدي نبحث فيه الآن
		  statusLabel.Text = rk.Name
		  ' لتبسيط البرنامج لن نستعمل مسارا خاصا بالبحث
		  Application.DoEvents()

		  ' Values : names and data
		  If rk.ValueCount > 0 Then
			  ' الوصول إلى لائحة القيم و أسمائها
			  Dim valueCol As String() = rk.GetValueNames()
			  For Each s As String In valueCol
				  ' المناداة على الدوال التي تتأكد من القيم و أسمائها
				  If ValueCheckBox.Checked Then CheckRegValueName(rk.Name, s)
				  If DataCheckBox.Checked Then
					  Dim oValue As Object = rk.GetValue(s)
					  If Not (oValue Is Nothing) Then CheckRegValueData(rk.Name, s, oValue.ToString())
				  End If
			  Next
		  End If

		  ' Key names
		  If rk.SubKeyCount > 0 Then
			  ' الوصول إلى المفاتيح
			  Dim keys As String() = rk.GetSubKeyNames()
			  For Each s As String In keys
				  If KeyCheckBox.Checked Then CheckRegKeyName(rk.Name, s)
				  ' إلى المفتاح التالي
				  Dim nextPath As String = rk.Name + "\" + s
				  nextPath = nextPath.Replace("\\", "\")
				  FindNext(rkRoot, nextPath.Substring(nextPath.IndexOf("\") + 1))
			  Next
		  End If
		  ' غلق المفتاح قبل الخروج
		  rk.Close()
	  End Sub

عند تشغيل عملية البحث, نمرر للدالة FindNext كائن من نوع RegistryKey يمثل المفتاح الجذر الذي سنبدأ منه عملية البحث. البارامتر path سنمرر من خلاله مسار المفتاح الداخلي الذي ستبدأ الدالة FindNext بالبحث فيه. فمثلا لبدء البحث من جذر المفتاح الأساسي HKEY_CURRENT_USER سننادي على الدالة FindNext بالشكل التالي :

FindNext(Registry.CurrentUser, "\")

الدالة FindNext تستعمل دوال أخرى :

CheckRegKeyName : تتحقق من توفر شروط البحث في المفتاح الحالي.

CheckRegValueName : تتحقق من توفر شروط البحث في اسم القيمة الحالي.

CheckRegValueData : تتحقق من توفر شروط البحث في بيانات القيمة الحالية.

الكود في حالته هاته ليس معدا لإعادة استعمال الكود في مشاريع أخرى. و قد يحتاج للوقت لتحريره للعمل في مشروع آخر. في الجزء التالي, سننشئ فئة معدة لإعادة الاستعمال في أي مشروع. ستكون إن شاء الله, فئة من نوع Component لتسهيل زيادتها على نماذج Form و تحديد خصائصها و أحداثها أوتوماتيكيا عن طريق نافذة الخصائص.

بقي شيء تجدر الإشارة إليه. ألا وهو كود صغير يمكن من تشغيل محرر تسجيل ويندوز و فتحه مفتاحا نحدده عند ظهور نافذة البرنامج. هذا هو الكود :

				' عند التشغيل regedit تحديد المفتاح الذي سيفتح عليه 
				Dim rk As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Applets\Regedit", True)
				rk.SetValue("LastKey", FindListBox.Items(FindListBox.SelectedIndex).ToString())
				rk.Close()
				' تشغيل regedit.exe
				Shell("cmd /c regedit.exe")

هذا الكود يكتب مسار المفتاح المراد فتحه عند تشغيل محرر تسجيل ويندوز داخل المفتاح HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regeditعلى القيمة LastKey ثم يقوم بتشغيل البرنامج الذي سيفتح و يظهر المفتاح عند أول ظهور.

تحياتي...

RegFind.rar

تم تعديل هذه المشاركة بواسطة محمد رضى في 2 سبتمبر 2009 في 21:05

1
#2

احسنت اخي محمد رضى و انت ُمحِق

اقتباس
لا أعرف إن كان أحدنا سيحتاج هذا الكود يوما ما في حياته البرمجية لكن أظن أن المعرفة بالشيء خير من الجهل به.

و في انتظار دروسك المتميزة التي لطالما اتحفتنا بها

<EMBED src=http://www.abdelghafar.com/images/banners/bm2.swf width=486 height=60 type=application/x-shockwave-flash EMBED < menu="false" loop="true" quality="high">

#3

السلام عليكم و رحمة الله تعالى و بركاته,,,

شكرا أخي عبد الله على التشجيع المتواصل.

في الجزء الأول تكلمنا عن سجل ويندوز بشكل مقتضب ثم تكلمنا عن كيفية القيام ببحث عن مفاتيح, أسماء قيم و القيم داخله بطريقة برمجية. أرى أن البرنامج المرفق قد تم تحميله أكثر من 11 مرة و هذا رقم لم أكن أظن الوصول إليه. الكود الذي يقوم بعملية البحث كما قلت سابقا, كان غير معد لإعادة الاستعمال في المشروعات الأخرى و لهذا فقد قمت بتصميم فئة أو كومبوننت تقوم بالبحث داخل سجل ويندوز. هذه الفئة تستعمل تقريبا نفس الكود زيادة على بعض التحسينات بالطبع. الفئة كذلك تقوم بإجراء البحث على مسلك غير المسلك الرئيسي للبرنامج ما يكسبها السرعة و الفعالية. استعمال الفئة سهل جدا. هناك عدد من الخصائص نحدد من خلالها الشروط الواجب توفرها في المفتاح أو القيمة أو اسمها كي يتم الإبلاغ عن وجودها. و هذه الخصائص هي :

CaseSensitive : تحدد أو ترجع قيمة تدل إن كانت عملية البحث تفرق بين الأحرف الكبيرة و الصغيرة.

TextToFind : تحدد أو ترجع النص المراد البحث عنه داخل سجل ويندوز.

WholeWord : تأخذ أو ترجع قيمة تدل على أن عملية البحث تتحقق من تساوي الكلمة المبحوث عنها أو وجود الكلمة فقط.

FindInKeys : تحدد أو ترجع قيمة تدل على أن عملية البحث تبحث داخل مفاتيح سجل ويندوز.

FindInValueNames : تحدد أو ترجع قيمة تدل على أن عملية البحث تبحث داخل أسماء قيم سجل ويندوز.

FindInValues : تحدد أو ترجع قيمة تدل على أن عملية البحث تبحث داخل قيم سجل ويندوز.

IncludeCurrentUser : تأخذ أو ترجع قيمة تدل على أن عملية البحث ستجري أيضا داخل المفتاح الجذر HKEY_CURRENT_USER.

IncludeLocalMachine : تأخذ أو ترجع قيمة تدل على أن عملية البحث ستجري أيضا داخل المفتاح الجذر .HKEY_LOCAL_MACHINE

IncludeUsers : تأخذ أو ترجع قيمة تدل على أن عملية البحث ستجري أيضا داخل المفتاح الجذر .HKEY_USERS

IncludeClassesRoot : تأخذ أو ترجع قيمة تدل على أن عملية البحث ستجري أيضا داخل المفتاح الجذر .HKEY_CLASSES_ROOT

IncludeCurrentConfig : تأخذ أو ترجع قيمة تدل على أن عملية البحث ستجري داخل المفتاح الجذر .HKEY_CURRENT_CONFIG

IsRunning : ترجع قيمة تدل على أن عملية البحث جارية أو لا.

هذه الخصائص يتم تحديدها قبل المناداة على الدالة Start التي تبدأ عملية البحث. هذه لائحة بالدوال Methods التي تتوفر عليها الفئة RegistryFinder :

Start : تبدأ عملية بحث جديدة على سجل ويندوز.

StopSearching : تنهي عملية البحث الجارية على سجل ويندوز.

OpenWithRegedit : تشغل محرر سجل ويندوز على المفتاح المحدد مساره على البارامتر keypath.

أما بالنسبة لأحداث الفئة فهي كالتالي :

EntryFound : يحدث في كل مرة تم العثور على مفتاح, قيمة أو اسمها تتوفر فيه شروط البحث. للحصول على العنصر الذي تم العثور عنه نستعمل البارامتر e في الدالة المشتركة في الحدث. الكائن e من نوع EntryFoundEventArgs الذي يحتوي على KeyName الذي يمثل اسم و مسار المفتاح الذي تم العثور عليه. ValueName الذي يمثل اسم القيمة التي توفرت فيها شروط البحث. Value القيمة التي توفرت فيها شروط البحث.

CurrentKey : يحدث في كل مرة تم فيها الانتقال إلى مفتاح آخر لاستكمال البحث داخله. هذا الحدث يمكن من تتبع المفاتيح التي تقوم الفئة RegistryFinder بالبحث فيها. للحصول على المفتاح الحالي الجاري فيه البحث, نستعمل e.KeyName في الدالة المشتركة في الحدث.

SearchStarted : يحدث قبيل بدء عملية بحث جديدة. يمكن الاشتراك في هذا الحدث لتهيئة واجهة المستخدم عند بدء عملية بحث جديدة.

SearchEnded : يحدث عند نهاية عملية البحث. يمكن الاشتراك في هذا الحدث لتهيئة واجهة المستخدم عند نهاية عملية البحث و إظهار النتائج.

هذه الفئة RegistryFinderيمكن استعمالها كفئة عادية يتم تعريفها أو إنشاؤها داخل الكود أو كـ كومبوننت يتم زيادته من على نافذة الأدوات إلى فورم ما يمكن من تحديد الخصائص و الأحداث يدويا من على نافذة الخصائص. لن أناقش كود الفئة لأنه نفسه هو الذي تكلمنا عليه في الجزء السابق من هذا الموضوع و كذلك لأن الفئة RegistryFinder تستعمل نفس الكود مع بعض التغييرات البسيطة و بعض التحسينات كذلك. هذا كود مبسط لتشغيل الفئة ككائن عادي داخل مشروع كونسول :

  Module Module1
	  Private WithEvents rf As New RegistryFinder()

	  Sub Main()
		  AddHandler rf.EntryFound, AddressOf rf_EntryFound
		  rf.TextToFind = "Windows"
		  rf.Start()
		  While rf.IsRunning
		  End While
	  End Sub

	  Public Sub rf_EntryFound(ByVal sender As Object, ByVal e As EntryFoundEventArgs) Handles rf.EntryFound
		  Console.WriteLine(e.KeyName)
	  End Sub
  End Module

أما بالنسبة لطريقة زيادة الكومبوننت RegistryFinder إلى مشروع WindowsForms فالأمر سهل للغاية. نقوم أولا بزيادة الكومبوننت من على نافذة الأدوات إلى الفورم. نقوم بتنشيط العنصر الذي تمت زيادته على الشريط أسفل النافذة ليتم إظهار الخصائص و الأحداث على نافذة الخصائص. نقوم بتحديد الخصائص حسب البحث الذي نريد القيام به. نقوم بعد ذلك بحجز الاشتراكات في الأحداث التي تهمنا و خاصة الحدث EntryFound الذي يحدث في كل مرة تم إيجاد مفتاح, قيمة أو اسمها تتوفر فيه شروط البحث. و للمزيد من المعلومات, المرجو قراءة الملف المرفق مع هذا الجزء و هو عبارة عن البرنامج المرفق مع الجزء السابق بعد تحريره للعمل مع الفئة RegFinder. تجدر الإشارة إلى أنه تم تغيير بسيط في واجهة المستخدم. لتحديد خصائص البحث المرجو النقر على الزر ]خيارات[ الذي يظهر قائمة بالخيارات المتوفرة. النقر على عنوان يقوم بتنشيط الخيار و النقر عليه مرة أخرى يقوم بإلغاء التنشيط. و أنا جاهز لاستفساراتكم و أسئلتكم حول الموضوع...

الملف المرفق به الفئة RegistryFinder و برنامج للبحث داخل سجل ويندوز. الكود معلق عليه بالتفصيل.

تحياتي...

RegFind.rar

تم تعديل هذه المشاركة بواسطة محمد رضى في 4 سبتمبر 2009 في 20:06

#4

جزاك الله خير الجزاء

وجعله في ميزان حسناتك

كنت في صدد السوال عن التعامل مع الريجستري

جاري التطبيق

واذا امكن اعطائي مرجع في هذا الموضوع اكون شاكر لك

تحياتي

#6

تجدر الإشارة إلى أنه سيرفع استثناء إذا حاولنا الوصول إلى أحد مربعات النموذج الذي توجد عليه الفئة RegistryFinder و ذلك في الدالتين المشتركتين في الحدث EntryFound و SearchEnded, هذا لأن هذين الحدثين يتم إرسالهما من مسلك آخر غير المسلك الرئيسي للتطبيق. و للحؤول دون رفع الاستثناء, نحتاج لتشغيل كود الوصول إلى مربعات النموذج داخل دالة ينادى عليها عن طريق Delegate. بهذه الطريقة سنضمن أن الكود سيشتغل داخل المسار الرئيسي للتطبيق و لن يرفع الإستثناء. الكود في الجزء الأخير صحيح و ليست به أخطاء. و يعمل بالطريقة التي شرحت للتو.

أولا نعرف Delegate الذي سنشغل عن طريقه دالة تغيير نص المربع statusLabel :

	Private Delegate Sub SetStatusText(ByVal statusText As String)

ثانيا, ننادي على الدالة InterThreadSetLabelText من الحدث RgistryFinder1_CurrentKeyChanged الذي ترسله لنا الفئة RegistryFinder من المسلك الخاص بالبحث داخل سجل ويندوز.

	' تغيير في المفتاح الحالي للبحث
	Private Sub RegistryFinder1_CurrentKeyChanged(ByVal sender As System.Object, ByVal e As WindowsApplication1.CurrentKeyEventArgs) Handles RegistryFinder1.CurrentKeyChanged
		Me.Invoke(New SetStatusText(AddressOf InterThreadSetStatusLabelText), New Object() {e.KeyName})
	End Sub

لاحظو معي أنني استعملت الدالة Invoke للكائن Me أي النمودج الرئيسي و ذلك لضمان تشغيل الدالة InterThreadSetStatusLabel على المسلك الرئيسي للتطبيق و ذلك لضمان عدم رفع إطار الدوت نت للاستثناء عند محاولة الوصول إلى مربع نموذج من مسلك غير الذي تم إنشاؤه عليه.

	' تتم المناداة لتشغيل الكود على المسار الرئيسي للبرنامج
	Private Sub InterThreadSetStatusLabelText(ByVal statusText As String)
		' إضهار مسار المفتاح الذي تتم فيه عملية البحث حاليا
		statusLabel.Text = statusText
	End Sub

الكود يشتغل كما هو مطلوب.

حاولت رفع هذا العناء عن المبرمج المستعمل للفئة RegistryFinder و لكنني لم أجد طريقة عملية لذلك. الطريقة الوحيدة التي وجدت هي استعمال Callback و لكن ستخسر الفئة RegistryFinder المميزات الخاصة للـ events. إذا كان أحد يعرف كيف يمكن إرسال حدث عابر للمسالك و ضمان تشغيل الحدث على المسلك الرئيسي للتطبيق, سأكون له من الشاكرين...

تحياتي...

تم تعديل هذه المشاركة بواسطة محمد رضى في 5 سبتمبر 2009 في 20:08

#7

متميزك كعادتك أخى محمد رضى ،

شكرا على الموضوع الرائع (بس ركز مع السى شارب :D )

جازاك الله كل خير

#8

السلام عليكــم ورحمـة الله وبركاتــه ،،

شكرا أخي DotNet-XML على تفاعلك معي في هذا الموضوع...

في هذه الإضافة, سنتكلم عن طريقة بسيطة للبحث عن المفاتيح و القيم التي تحوي مسارات يتيمة لمجلدات أو ملفات غير موجودة على أي وحدة تخزين. كما نعلم جميعا, فمهما زادت محتويات مسجل النظام مهما زاد تقل نظام التشغيل بكامله. هذا راجع للاستعمال المكثف لمسجل النظام من طرف نظام التشغيل والتطبيقات المثبتة عليه. و مهما زادت كمية المحتويات من مفاتيح و قيم مهما زاد الوقت اللازم للبحث عنها و الوصول إليها. و لهذا كان من بين الطرق الناجعة للحفاظ على فعالية و سرعة نظام التشغيل هي تنظيف مسجل النظام و إحدى طرق تنظيف مسجل النظام هي البحث عن المفاتيح و القيم التي تحوي مسارات ملفات و مجلدات يتيمة غير موجودة أصلا على أي وحدة تخزين. حذف هذه القيم والمفاتيح تنقص من الوقت اللازم للبحث و بالتالي تزيد من فعالية نظام التشغيل و التطبيقات.

post-207152-1254389327_thumb.jpg

عملية تنظيف مسجل النظام تبدأ بعملية استعراض كل القيم على كل المفاتيح المعدة للاستعمال من طرف التطبيقات و البرامج المثبتة على النظام. مثال على ذلك لائحة آخر الملفات المفتوحة من طرف تطبيق كان محرر نصوص أو صور أو غيرها. و لهذا فسيكون المفتاح الجذر HKEY_USERS المرشح الأول للبحث فيه عن المفاتيح و القيم التي تدل على مسارات يتيمة. المفاتيح الجذور الأخرى قد تحتوي هي الأخرى على معلومات غير موجودة و غير ضرورية تمكننا من حذف هذه المفاتيح و القيم. سنتطرق في إضافات أخرى لهذا الموضوع.

عملية تنظيف مسجل النظام يجب أن تراعي وجود مفاتيح و قيم تحوي مسارات مجلدات و ملفات هي في نفس الآن غير موجودة و لكن هذه المفاتيح و القيم معدة لاستعمالات قد لا يحتاجها بعض مستخدمي النظام لأنها تخص مجال تخصص خاص بفئة من المستخدمين أو غير ذلك. حذف هذه القيم و المفاتيح قد تعرض نظام التشغيل بكامله لأعطاب و فقدان الفعالية. و على سبيل الذكر لا الحصر فقد تجاهلت أي تعامل مع المسارات التي تدل على مكتبات لأن هذا النوع من الملفات يحتاج لتعامل خاص سوف أخصص له إضافة خاصة مستقبلا.

الكود بسيط للغاية و معلق عليه بالتفصيل و أنا مستعد للإجابة على أي تساؤلات تخصه.

	  ' عندما تعلمنا الفئة RegistryFinder بوجود قيمة تتوفر فيها شروط البحث, نقوم بالتأكد من أنها مسار ملف أو مجلد
		' و بعد ذلك نتأكد من عدم وجوده و في هذه الحالة نزيده على لائحة العناصر اليتيمة المرشحة للحذف بكل أمان.
		Private Sub RegistryFinder1_EntryFound(ByVal sender As System.Object, ByVal e As WindowsApplication1.EntryFoundEventArgs) Handles RegistryFinder1.EntryFound
			If e.Value.Length > 3 Then
				' الأفضل استعمال Regular Expressions للتأكد من أن القيمة هي لمسار مجلد أو ملف
				' لكن و لتبسيط الكود...
				If e.Value(1) = ":" Then
					If e.Value(2) = "\" Then
						Dim exists As Boolean = False
						If Directory.Exists(e.Value) Then
							exists = True ' مسار مجلد موجود
						ElseIf File.Exists(e.Value) Then
							exists = True ' مسار ملف موجود
						End If
						' ما يهمنا هي المسارات الغير موجودة
						If Not exists Then
							' الرسوم الممنوعة
							For i As Integer = 0 To e.Value.Length - 1
								' هذه رسوم إما ممنوع تواجدها على مسار ملف أو مجلد أو أنها تستعمل للدلالة على معلومة
								' لا نريد التلاعب معها كمكتبة أو أيقونة نوع من أنواع الملفات
								If "/*?""<>|,%^".Contains(e.Value(i)) Then Return
							Next
							' لا يجب التلاعب مع المكتبات
							If e.Value.ToLower().Contains(".dll") Then Return
							If e.KeyName.ToLower().Contains("typelib") Then Return
							' زيادة العنصر الغير موجود
							Dim lvi As New ListViewItem(New String() {e.KeyName, e.ValueName, e.Value})
							Me.Invoke(New AddOrphanEntryDelegate(AddressOf AddOrphanEntry), New Object() {lvi})
						End If
					End If
				End If
			End If
		End Sub

في المشروع المرفق تجدون مشروعا صغيرا يقوم بالبحث داخل سجل النظام على مفاتيح و قيم تحوي مسارات يتيمة لمجلدات أو ملفات غير موجودة على أي وحدة تخزين. مسألة التنظيف مسألة سهلة هي الأخرى و أغلب البرامج المعدة لهذا النوع من العمل تترك الكلمة الأخيرة للمستعمل لاختيار المفاتيح و القيم المرشحة للحذف. عملية الحذف غير مدعمة على المشروع لأن المشروع المرفق هدفه توضيح الفكرة و ليس العمل كمنظف لمسجل النظام. و من خلال دراستي للمفاتيح و القيم التي يقوم بترشيحها للحذف لا تمثل خطرا على نظام التشغيل إذا ما تم حذفها فعلا. و أرجو من الأعضاء الكرام الإبلاغ عن أي خطر قد يمثله الكود المرفق.

تحياتي...

OrphanFinder.rar

تم تعديل هذه المشاركة بواسطة محمد رضى في 1 أكتوبر 2009 في 14:33

#9

سلام عليكم

جزاك الله كل خير مواضيعك اكثر من رائعة

الى الامام وانصحك بعمل كتاب تعليمي في vb

#10

بسم الله الرحمن الرحيم

الموضوع جميل جدا و نرجو التوسع

تم تعديل هذه المشاركة بواسطة أحمد خميس راشد في 9 نوفمبر 2009 في 23:06

1 −1

أحمد خميس راشد

جمهورية مصر العربية

Bibo_spider@hotmail.com

#11

ما شاء الله عليك على هذه البرمجة الرائعة

حقا برنامج كبير

جزاك الله خيرا

#12

شكرااااااااااااا الله يعطيك العافيه

مواضيع مشابهة