كيف البحث عن ملف في حالة عدم وجوده بالمسار
#1
السلام عليكم ورحمة الله وبركاته

كيف معرفة مسار ملف محدد آليا بحيث يقوم البرنامج بالبحث عن الملف في حالة وجوده يظهره والا يظهر رسالة يخبرك انه مفقود
وقد جربت استخدام هذه الدوال لكن لم تادي المرغوب فيه
كود :
[align=left]var fullFileName : string; begin fullFileName := 'C:\Program Files\Unit1.dcu'; ShowMessage('Drive = '+ExtractFileDrive (fullFileName)); ShowMessage('Dir = '+ExtractFileDir (fullFileName)); ShowMessage('Path = '+ExtractFilePath (fullFileName)); ShowMessage('Name = '+ExtractFileName (fullFileName)); ShowMessage('Ext = '+ExtractFileExt (fullFileName));[/align]
هذة الدوال لازم تعطيها المسار ولا تقوم بالبحث
شكرا مقدما
الرد
#2
PHP كود :
if FileExists(fileName)
  
then ShowMessage(fileName+' exists OK') 
الرد
#3
اخي الفاضل حياك الله واثابك بحسن الجزاء

لم افهمك ولم استوعب اجابتك فخذني على قدري ولو بتفصيل بسيط واسف على ازعاجكم مسبقا

FileExists هذه الدالة لا تمكننا من البحث بل هي تاكد من الملف موجود ام لا، دالة تقوم بالبحث عن ملف ما فحين تجده تظهر مساره وان لم تجده تعود بفشل

شكرا على تعاونك اخي الفاضل
جزاك ربي بالغفران
السلام عليكم
الرد
#4
إذا سيتوجب عليك عمل حلقة تنتهي عندما تقوم بالتأكد من جميع الملفات التي في الهاردسك , ولا اضنها فكرة سديدة
فهي تأخذ وقتاً كثيراً , ساكتب لك مثال غداً إن شاء الله .
الرد
#5
هذا أخي إجراء يقوم بالبحث عن ملف في مجلد معين مع إمكانية البحث داخل المجلدات الفرعية وهو يستخدم فكرة استدعاء الدالة لنفسها Recursif وتقوم بوضع مسار الملف في listbox

كود :
procedure TForm14.RecSearch(const sPathName, sFile : String; const subDir : Boolean); var sr : TSearchRec; sPath : String; begin Application.ProcessMessages; sPath:=IncludeTrailingBackslash(sPathName); if FindFirst(sPath + sFile, faAnyFile - faDirectory, sr) = 0 then repeat listBox1.Items.Add(sPath + sr.Name); // send files into a ListBox until FindNext(sr) <> 0; FindClose(sr); If not subDir then Exit; if FindFirst(sPath + '*.*', faDirectory, sr) = 0 then repeat if ((sr.Attr and faDirectory) <> 0) and (sr.Name<>'.') and (sr.Name<>'..') then RecSearch(sPath + sr.Name, sFile, True); until FindNext(sr) <> 0; FindClose(sr); end;

طريقة الاستدعاء
RecSearch('c:\windows','File.dll', true);
الرد
#6
السلام عليكم
قمت بتجربة بسيطة لدالة FindAllDirectories بهذا الشكل :
PHP كود :
Memo1.Lines.AddStrings(FindAllDirectories('/')); 
حيث سأقوم بهذه الطريقة بإستخراج جميع المسارات الموجودة في النظام لكي ابحث عن ملف, وقمت بذلك فقط لأرى كم الوقت الذي سيستغرق , النتائج كانت كما توقعت , أولاً يوجد إستنزاف للذاكرة حيث بلغ حجم البرنامح في الذاكرة قرابة 2 قيقاً xD والامر الآخر ان العملية تستنزف الـ CPU قرابة 25% , والأمر الآخير ان كل ذلك حصل قبل ان تنتهي الدالة من البحث فقمت بإغلاق البرنامح , طبعاً هذه العملية فقط لإخراج المسارات الممكن البحث بها , أي اننا لم نأتي للجزء الرئيسي وهو البحث عن الملف داخل تلك المسارات

لذلك إذا كنت تستطيع تحديد مسار معين يمكن ان يكون فيه الملف فهي أفضل وسيلة لستعمال هذه الدوال لتجنب كل تلك الأمور المذكورة سابقاً.
كمثال ربما يوجد الملف المراد البحث عنه في مسار FilePrograms او Desktop فيمكن استعمال تلك الدوال بطريقة افضل .

بالنسبة لمثال الأخ "الكاسر الأخير" فهي نفس العملية وكذلك لا انصحك بإستعمال Recursif لان الستاك سيكون ملئ فستحدث عدة مشاكل ..

ملاحظة : استعملت لازارس على لينكس .
الرد
#7
http://www.delphi4arab.net/forum/showthr...p?tid=1386
http://www.delphi4arab.net/forum/showthr...p?tid=2054
الرد
#8
السلام عليكم ورحمة الله وبركاته

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

شكرا ساعتمد عاى تحديد مسار معين لاضع فيه مجلد القاعدة واجعل البرنامج يتاكد من وجد القاعده ليشتغل والا يتوقف عن العمل
كما ساعتمد على نفس الفكره في وضع جداول التنقيط التي تسلم الاى الاساتذه لاقوم بسحب واستراد النقاط
شكرا وبارك الله فيكم جميعا
السلام عليكم
الرد
#9
السلام عليكم
من طبيعي أن يحدث Freezing للفورم
يمكن تجنب هذا بتشغيل هذا الإجراء في Thread منفصل

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

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم