السلام عليكم
احاول صنع برنامج بحث
حيث عندما اكتب اسم معين يقوم البرنامج بلبحث عنه بداخل الجهاز كله
من ضمنه الفلاش ميموري اذا كان مربوط
وجدت بعض الاكواد
هذا للبحث
كود :
procedure TForm1.Button1Click(Sender: TObject);
function SearchForFile( aDir: string; aFileName: string ): string;
var
tmpSearchRec: TSearchRec;
begin
Label1.Caption := 'Searching: ' + aDir;
Label1.Repaint;
Result := '';
if FindFirst( aDir + '*', faDirectory, tmpSearchRec ) = 0 then
repeat
if faDirectory = tmpSearchRec.Attr then
begin
if ( tmpSearchRec.name <> '.' ) and ( tmpSearchRec.name <> '..' ) then
Result := SearchForFile( aDir + tmpSearchRec.name + '\', aFileName )
end
else
if SameText( ExtractFileName( tmpSearchRec.Name ), aFileName ) then
Result := aDir + tmpSearchRec.Name;
until ( FindNext( tmpSearchRec ) <> 0 ) or ( Result <> '' );
FindClose( tmpSearchRec );
end;
begin
ShowMessage( SearchForFile( 'c:\', 'calc.exe' ));
end;
استعملته وقد نجح الامر معي
لاكن المشكله لايبحث اله بلمجلد C:\
هل من طريقه او كود
يبحث داخل الجهاز بلكامل ومن ضمنه الفلاش ميموري
السلام عليكم
يبحث في الـ c لانك امرته ان يبحث فقط في السي
كود :
ShowMessage( SearchForFile( 'c:\', 'calc.exe' ));
يجب ان تحصل على جميع الدرايفات المتوفرة و تبحث فيها
الكود غير مجرب
كود :
procedure TForm1.Button1Click(Sender: TObject);
var
List: TStringList;
I: Integer;
begin
List := TStringList.Create;
try
for i := 0 to List.Count - 1 do
ShowMessage(SearchForFile(List[i], 'calc.exe' ));
finally
List.Free;
end;
end;
procedure GetDriveLetters(AList: TStrings);
var
vDrivesSize: Cardinal;
vDrives : array[0..128] of Char;
vDrive : PChar;
begin
AList.BeginUpdate;
try
// clear the list from possible leftover from prior operations
AList.Clear;
vDrivesSize := GetLogicalDriveStrings(SizeOf(vDrives), vDrives);
if vDrivesSize=0 then Exit; // no drive found, no further processing needed
vDrive := vDrives;
while vDrive^ <> #0 do
begin
AList.Add(StrPas(vDrive));
Inc(vDrive, SizeOf(vDrive));
end;
finally
AList.EndUpdate;
end;
end;
كود :
يقوم البرنامج بلبحث عنه بداخل الجهاز كله
اعتقد الاخ يقصد البحث بالمجلدات الفرعية للمجلد المحدد و ليس البحث في درايفرات
مثلا لو حدد القرص c سيتم البحث ايضاا في مجلدات windows - programmes - user - ......
لو كان دا طلبك فانت بحاجة لعمل اشبه بالخوازمية و قد عملت مرة واحد تشبهها لاكن بلغة اوتوايت
ودا كان حالي لها
1- نقوم بعمل مصفوفة array غير محددة طول فسنحدد طوله برمجياا
2 - نضع مجلد الـ root مثلا c في اول المصفوفة
3 - الخوازمية تبدا بالبحث في هته المصفوفة من اول عنصر الي هو الـ root
4 - عند ايجادها لمجلدات تقوم بتحديث المصفوفة و وضع المجلدات الجديدة فيها
ادا الخوازمية عند انتهائها من بحث في root تكون قد وضعت اسماء مجلدات الفرعية بعدها فتبدا البحث فيها و عند ايجاد مجلدات فرعية داخل مجلدات الفرعية الاولى تقوم بتحديث المصفوفة و وضع المجلدات الجديدة فيها و هكدا دواليك
الامر اشبه ب linked list
اتمنى وصلت فكرة البحث داخل مجلدات الفرعية و اعتقد هنالك مصادر مفتوحة تهتم بالامر
find in sub folder
السلام عليكم عفوا لم افهم السآل جيدا شكرا اخ هوديني ان كان الامر كذلك فالامر سهل و ذلك عن طريق استخدام
الـ recursive function تقوم باستدعاء الدالة في النهاية مع تمرير المجلد الجديد في النهاية
المثال مأخوذ من كتاب delphi 6 devlopers guide صفحة 222 عدل على المثال بما يناسبك
اعتقد نفس القسم موجود في هذا الكتاب
http://delphi4arab.net/forum/showthread....lphi+guide
PHP كود :
procedure TSearchThread.FindAllFiles(const Path: string);
{ procedure searches Path subdir for files matching filespec }
var
SR: TSearchRec;
Advanced Techniques
PARTII
222
LISTING 5.9 Continued
begin
{ find first file matching spec }
if FindFirst(Path + FileSpec, faArchive, SR) = 0 then
try
repeat
SearchFile(Path + SR.Name); // process file
until (FindNext(SR) <> 0) or Terminated; // find next file
finally
SysUtils.FindClose(SR); // clean up
end;
end;
procedure TSearchThread.DoSearch(const Path: string);
{ procedure recurses through a subdirectory tree starting at Path }
var
SR: TSearchRec;
begin
{ look for directories }
if FindFirst(Path + ‘*.*’, faDirectory, SR) = 0 then
try
repeat
{ if it’s a directory and not ‘.’ or ‘..’ then... }
if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> ‘.’) and
not Terminated then
begin
FindAllFiles(Path + SR.Name + ‘\’); // process directory
DoSearch(Path + SR.Name + ‘\’); // recurse
end;
until (FindNext(SR) <> 0) or Terminated; // find next directory
finally
SysUtils.FindClose(SR); // clean up
end;
end;
end.