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

Recursive File Search

رائج
بدأه Xacker في 9 يوليو 2008 · 56 رد · 10,747 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ماذا تعرف عن recursive file search في الأسمبلي وفي بينة 32 بت ؟ :)

واحد عبيط قال:

ما هو الـ recursive أساساً؟

طيب استخدم رأسك و Google وابحث ثم انظر ما هو recursive file search

wikipedia.org مكان جيد للبحث عن الفكرة العامة --- ثم أخبرني كمبرمج أسمبلي أو مبرمج في أي لغة أخرى مثل الفيجوال أو السي أو الدلفي, كيف تقوم بتطبيق هذا الأمر

مع الكود لو استطعت حتى لو كان بلغة أخرى.

بانتظار المشاركات

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

recursive هو استدعاد الدالة لنفسها مرات متكررة ,,,

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

عندي مشاركة و لم تظهر لحد الآن لماذا .

GamingMasteR كتب:
recursive هو استدعاد الدالة لنفسها مرات متكررة ,,,

حتى إنتهاء الشرط .

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#4

اوكيه فكرة recursive أصبحت واضحة. كيف نقوم بكتابة الدالة بحيث تستدعي نفسها وتنهي نفسها دون مشاكل؟ بأي لغة برمجة لا بأس المهم ايصال الفكرة في البداية.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5
اقتباس
حتى إنتهاء الشرط .

طبعاً لا تحتاج كلام هذه :lol:

هذه الطريقة غير آمنة .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

السلام عليكم:

هذه دالة بالسي تحسب المجموع:

  1.  
  2. int int_sum(int num)
  3. {
  4. return num !=0 ? (num + int_sum(num-1)): 0;
  5. }
  6.  

tvquran_6.gif

#7
Xacker كتب:
اوكيه فكرة recursive أصبحت واضحة. كيف نقوم بكتابة الدالة بحيث تستدعي نفسها وتنهي نفسها دون مشاكل؟ بأي لغة برمجة لا بأس المهم ايصال الفكرة في البداية.

أليس من الأفضل أن تعطينا واجب و نحن نحل أكيد يكون بسيط .

GamingMasteR كتب:
طبعاً لا تحتاج كلام هذه :lol:

هذه الطريقة غير آمنة .

هذه معلومة جديدة و لكن ما أعلمه أن هذه الطريقة مكلفة للذاكرة و خاصة إن كان الإستدعاء إلى ما لانهاية .

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#8

هناك نقطة هل نستعمل ال Recursion أم البحث عن الملفات يكون Recursive بمعنى يبحث فى ال Folder وال Sub Folders أسفل منة

#9
ASDen كتب:
هناك نقطة هل نستعمل ال Recursion أم البحث عن الملفات يكون Recursive بمعنى يبحث فى ال Folder وال Sub Folders أسفل منة

بالظبط هو ده اللى كنت عاوز اسئل فيه

الموضوع مش مستساغ عندى على الاطلاق

ازاى تستخدم ال recursion فى البحث عن الملف

معك اسم ملف نفرض era ومعك ههذه ال folder/files tree

--master
--me
--mera
   --hi
   --oop
   --era
	  --xdf
	  --oos
		--erax
	  -hi.exe
	  -hi.txt
	  -era.txt
   --eramax
	 --hi
   --ttl
	 -era.txt
-era.txt
-eramax.txt
-xtter.txt

انا ليس لدى فكرة ان استخدام ال recursion يصلح للبحث عن الملفات وان كان فهو كما قال الاخ سيف سيستهل كم كبير من الميمورى

اطيب المنى:)

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#10

نعم نستخدمه في البحث عن الملفات و المجلدات الفرعية أيضا ,, لا اعرف ما هو الغير مستساغ !!

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#11
GamingMasteR كتب:
نعم نستخدمه في البحث عن الملفات و المجلدات الفرعية أيضا ,, لا اعرف ما هو الغير مستساغ !!

هل تقصدون ان نقوم بفتح كل المجلدات ثم نبدأ فى البحث عن الملف المطلوب من اخر مجلد فتم فتحه ونظل نبحث داخله حتى ننتهى منه ثم نغلقه وندخل الى الملف الذى كان parent directory له وهكذا الى ان نصل الى ال parent directory الذى بدانا من عنده البحث

ان كان فذلك فانا فى البداية ظننت السؤال على غير ذلك

اطيب المنى:(

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#12

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

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13
GamingMasteR كتب:
انت تبحث داخل مسار معين وتقوم بجرد خواص كل كائن داخل المسار ,, اذا كان من خواصه انه مجلد فتقوم باستدعاء الدالة مرة اخرى .

بالضبط وعند استدعاء الدالة مرة أخرى إما أن تجد ملف يتطابق مع الخصائص الموجودة التي تريدها (قد تكون تبحث عن مجلدات وليس ملفات) فتقوم بما تريد القيام به ثم تقوم بالبحث عن الملف التالي إلى أن لا يكون بإمكانك إيجاد أي ملف أو مجلد آخر ضمن ال dir الذي تعمل به فتدخل في مجلد فرعي وتبدأ البحث من جديد.

العملية تكون خطرة في حال كان استخدامك لها خاطئ فيدخل البرنامج في loop لا يخرج منه -- لكن هذا الأمر ليس بالشئ الكثير فأي عملية do loop عادية لها نفس الخطورة.

لن تتضح الفكرة تماماً إلا بكود لذلك سننظر إلى شفرة الأخ فهد:

[color= #0000ff;]int int_sum[color= #000000;]([color= #0000ff;]int num[color= #000000;]) [color= #000000;]{ [color= #0000ff;]return num [color= #000000;]![color= #000000;]=[color= #000000;]0 ? [color= #000000;](num [color= #000000;]+ int_sum[color= #000000;](num[color= #000000;]-1[color= #000000;])[color= #000000;])[color= #000000;]: [color= #000000;]0; [color= #000000;]}

لنفرض ان num=3

سيتم التنفيذ بالشكل المقرب التالي:

[color= #000000;]3 [color= #000000;]![color= #000000;]= [color= #000000;]0 [color= #000000;]> [color= #000000;]3 [color= #000000;]+ [color= #000000;](execute func[color= #000000;]) [color= #000000;]> not returned 

[color= #000000;]2 [color= #000000;]![color= #000000;]= [color= #000000;]0 [color= #000000;]> [color= #000000;]2 [color= #000000;]+ [color= #000000;](execute func[color= #000000;]) [color= #000000;]> not returned 

[color= #000000;]1 [color= #000000;]![color= #000000;]= [color= #000000;]0 [color= #000000;]> [color= #000000;]1 [color= #000000;]+ [color= #000000;](execute func[color= #000000;]) [color= #000000;]> not returned 

[color= #000000;]0 [color= #000000;]== [color= #000000;]0 [color= #000000;]> [color= #0000ff;]return [color= #000000;]0 to step3 

[color= #000000;]1 [color= #000000;]+ [color= #000000;]0 [color= #000000;]> [color= #0000ff;]return [color= #000000;]1 to step2 

[color= #000000;]2 [color= #000000;]+ [color= #000000;]1 [color= #000000;]> [color= #0000ff;]return [color= #000000;]3 to step1 

[color= #000000;]3 [color= #000000;]+ [color= #000000;]3 [color= #000000;]> [color= #0000ff;]return [color= #000000;]6 and end function

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#14

الـrecursive خطر من ناحيتين :

1- اذا كنت تجمع رقم عدة مرات اثناء البحث ربما يحدث لك Arithmetic overflow ,, لذلك من الأفضل استخدام وحدات ارقام كبيرة كالـlong double او LONGLONG .

2- تخيل ان لدينا 1000 مجلد فرعي (عدد صغير بالنسبة للواقع) ,, وأنك تستخدم local variables بمقدار 0x1000 بايت لاغراض مختلفة ,, في كل مرة تقوم بحجز قيمة 0x1000 بايت تراكميا من المكدس ,, لكن المكدس المسكين له حد معين :lol: .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#15

من يزيد؟ :D

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#16

المرفق مأخوذ من احد المواقع مكتوب بال vb .

FindFileByExt.zip

#17

أي خبر جديد؟؟ أنا متابع ومنتظر!!

#18

Recursive File Search تمت برمجته بالاسمبلي

واعتمدت في بداية الكود على كود تمت كتابته بواسطة Xacker في مشروع ال crc مع الاخذ بالملاحظات الموجودة داخل هذا المشروع وبعض الاكواد

بل ان بداية الكود منقولة حرفيا وبالتعليقات من الموضوع السابق

الكود عبارة عن مسودة اولية دون واجهات مرئية تبحث عن ملفات ال txt داخل جميع اقراص الهارد فقط،ويقوم بتخزين كل ملف وجده مع مساره داخل ملف باسم extfile يفصل ما بين الملفات "2@"

.586
.model flat,stdcall
option casemap:none

   include windows.inc
   include kernel32.inc
   include user32.inc

   includelib kernel32.lib
   includelib user32.lib

.data

fname  db "Htemp",0
fname2  db "extfile",0
all   db "*.*",0
txt   db "*.txt",0
con1  db "@1",0
con2  db "@2",0
lay   db "job end",0
site  db "State",0	  

.data?

hfile1  dd ?
hfile2  dd ?
f1handle dd ?
f2handle dd ?
dLeft  dw ?
mod1  dd ?
mod2  dd ?
mod3  dd ?
buf1  dd ?
buf2  dd ?
buf3  dd ?
buf4  dd ?
NOBR  dd ?
nDSize  dw ?
Drives  dd ?
count1  dw ?
count2  dd ?
count3  dd ?
sbuf1  dd ?
sbuf3  dd ?
sbuf4  dd ?
fsize  dd ?
xade  dd ?

f1s   WIN32_FIND_DATA <?>
f2s   WIN32_FIND_DATA <?>

.code
start:

 invoke  CreateFile,addr fname2,FILE_ALL_ACCESS,FILE_SHARE_READ+ FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
 mov   hfile2,eax
 invoke  GlobalAlloc, GMEM_FIXED, 1; allocate 1 byte of memory to use it as a NULL to 
							 ; define the number of the drives
 mov   Drives, eax
 invoke  GetLogicalDriveStrings, NULL, Drives; the return is the length of the lpBuffer that we need
 mov   nDSize, ax
 push  eax; \ save it to use it later
 push  eax; /
 push  eax
 invoke  GlobalFree, Drives; free the small lpBuffer
 pop   eax; restore the lpBuffer length to EAX
 invoke  GlobalAlloc, GMEM_FIXED, eax; allocate the required buffer to store all drives
 mov   Drives, eax; save the address
 pop   eax; restore lpBuffer length to EAX
 invoke  GetLogicalDriveStrings, eax, Drives; return the drives strings

 invoke  CreateFile,addr fname,FILE_ALL_ACCESS,FILE_SHARE_READ+ FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
 mov   hfile1,eax
 invoke  WriteFile,hfile1,addr con1,2,addr xade,0

 mov   edi,Drives
 xor   ebx,ebx
 mov   bx,4
 pop   eax
 invoke  GlobalAlloc, GMEM_FIXED, eax;allocate buffer to store the Fixed drives only
 push  eax
 sub   mod1,4
 jmp   _checkfixed
_pcheckfixed: 
 mov   dLeft, 4
_checkfixed:
 add   bx, dLeft
 mov   cx, nDSize
 cmp   bx, cx
 ja   _nomore_drives
 add   di, dLeft
 invoke  GetDriveType, edi; get mapped drive letter type
 cmp   eax, 3   ; not fixed drive? (HDD drives > 3, Removable drives > 2, Media drives > 5)
 jne   _pcheckfixed; return if not fixed

_registerdrive:
 pop   eax
 push  eax
 add   mod1,4  
 add   eax,mod1
 mov   edx,dword ptr [edi]
 mov   dword ptr [eax],edx
 inc   count1
	jmp   _pcheckfixed


_nomore_drives:
 sub   mod2,4
 pop   eax
 mov   mod3,eax
_111:
 add   mod2,4
 mov   edi,mod3
 add   edi,mod2
 dec   count1
 cmp   count1,-1
 je   _fullend

 invoke  GlobalAlloc, GMEM_FIXED, 7
 mov   buf1,eax
 mov   sbuf1,7
 mov   edx,dword ptr [edi]
 mov   dword ptr [eax],edx
 add   eax,3
 mov   dword ptr [eax],"*.*"

_FFF: 
 invoke  FindFirstFile,buf1,addr f1s
 mov   f1handle,eax
 cmp   eax,-1
 jne   _FindFolder
_222:
 invoke  CloseHandle,hfile1
 invoke  CreateFile,addr fname,FILE_ALL_ACCESS,FILE_SHARE_READ+ FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
 mov   hfile1,eax
 invoke  GetFileSize,hfile1,NULL
 mov   fsize,eax
 invoke  GlobalAlloc, GMEM_FIXED, fsize
 mov   buf2,eax

 invoke  SetFilePointer,hfile1,NULL, NULL,FILE_BEGIN
 invoke  ReadFile,hfile1,buf2,fsize,addr xade,NULL
 mov   esi,buf2
 add   esi,fsize
 cmp   word ptr [esi-2],"1@"
 je   _111@1
 sub   esi,6
 mov   eax,dword ptr [esi]
 mov   dword ptr [f1handle],eax
 invoke  GlobalFree,buf2
;;
 mov   esi,buf1
 push  esi
 add   esi,sbuf1
 sub   esi,5
 mov   count3,0
_loop3:
 dec   esi
 inc   count3
 cmp   byte ptr [esi-1],"\"
 jne   _loop3
 mov   edx,sbuf1
 sub   edx,count3
 dec   edx
 mov   sbuf1,edx
 mov   ebx,sbuf1
 sub   ebx,4
 invoke  GlobalAlloc, GMEM_FIXED, sbuf1
 mov   buf1,eax
 pop   esi
 push  esi
 mov   ecx,ebx
 mov   edi,buf1
 rep movsb byte ptr [edi],byte ptr [esi]
 mov   eax,dword ptr [all]
 mov   dword ptr [edi],eax
 pop   esi
 invoke  GlobalFree,esi
;;
 invoke  SetFilePointer,hfile1,-6,NULL,FILE_END
 invoke  SetEndOfFile,hfile1
 jmp   _FNF
_FindFolder:
 mov   ebx,offset f1s.dwFileAttributes
 and   byte ptr [ebx], 10h
 je   _FNF; if the zero flag is set (means that ZF=1) that mean its not directory
 cmp   byte ptr [ebx+2ch], 2eh
 jne   _TrueFolder
 cmp   byte ptr [ebx+2dh], 00h
 je   _FNF
 cmp   byte ptr [ebx+2dh], 2eh
 jne   _TrueFolder
 cmp   byte ptr [ebx+2eh], 00h
 je   _FNF
_TrueFolder:
_RegisterHandle:
 invoke  SetFilePointer,hfile1,0,NULL,FILE_END
 invoke  WriteFile,hfile1,addr f1handle,4,addr xade,0
 invoke  SetFilePointer,hfile1,0,NULL,FILE_END
 invoke  WriteFile,hfile1,addr con2,2,addr xade,0

 add   ebx,2ch
 mov   count2,0
_definelenfldr:
 inc   count2
 inc   ebx
 cmp   byte ptr [ebx],0
 jne   _definelenfldr
 sub   ebx,count2
 mov   edx,sbuf1;old sbuf1
 add   edx,count2
 inc   edx
 mov   esi,sbuf1;old sbuf1
 mov   sbuf1,edx;new sbuf1
 mov   edi,buf1;old buf1
 push  edi
 invoke  GlobalAlloc, GMEM_FIXED, sbuf1;new sbuf1
 mov   buf1,eax;new buf1
 dec   esi
 add   edi,esi
_loop1:
 dec   edi
 dec   esi
 cmp   byte ptr [edi-1],"\"
 jne   _loop1
 mov   ecx,esi
 pop   edi
 push  edi
 mov   esi,edi
 mov   edi,eax
 rep movsb byte ptr [edi], byte ptr [esi]
 mov   ecx,count2
 mov   esi,ebx
 rep movsb byte ptr [edi], byte ptr [esi]
 mov   byte ptr [edi],"\"
 inc   edi
 mov   eax,dword ptr [all]
 mov   dword ptr [edi],eax
 pop   edi
 invoke  GlobalFree,edi;edi represent the old buf1
 jmp   _FFF

_111@1:
 invoke  GlobalFree,buf2
 jmp   _111 

_FNF:
 invoke  FindNextFile,f1handle,addr f1s
 test  eax,eax
 je   _FFF2
 cmp   eax,18h
 je   _FFF2
 jmp   _FindFolder

_FFF2:
;;
 mov   eax,sbuf1
 mov   sbuf4,eax
 add   sbuf4,3
 invoke  GlobalAlloc, GMEM_FIXED, sbuf4
 mov   buf4,eax
 mov   ecx,sbuf1
 mov   esi,buf1
 mov   edi,buf4
 rep movsb byte ptr [edi], byte ptr [esi]
 sub   edi,4
 mov   esi,offset txt
 mov   ecx,5
 rep movsb byte ptr [edi], byte ptr [esi]
 mov   byte ptr [edi],0
 invoke  FindFirstFile,buf4,addr f2s
 mov   f2handle,eax
 cmp   eax,-1
 jne   _CheckIfFile
_nofile:
 cmp   f2handle,-1
 je   _333
 invoke  FindClose,f2handle
_333:
 invoke  FindClose,f1handle
 JMP   _222

_CheckIfFile:
 mov   ebx,offset f2s.dwFileAttributes
 and   byte ptr [ebx], 10h
 jne   _FNF2; if the zero flag is set (means that ZF=1) that mean its not directory
 cmp   byte ptr [ebx+2ch], 2eh
 jne   _RegisterFile
 cmp   byte ptr [ebx+2dh], 00h
 je   _FNF2
 cmp   byte ptr [ebx+2dh], 2eh
 jne   _RegisterFile
 cmp   byte ptr [ebx+2eh], 00h
 je   _FNF2
_RegisterFile:
 add   ebx,2ch
 mov   count3,0 
_loop2:
 inc   count3
 inc   ebx
 cmp   byte ptr [ebx],0h
 jne   _loop2
 sub   ebx,count3
 mov   eax,sbuf1
 sub   eax,3
 add   eax,count3
 mov   sbuf3,eax
 invoke  GlobalAlloc,GMEM_FIXED,sbuf3
 mov   buf3,eax
 mov   esi,buf1
 mov   edi,buf3 
 mov   ecx,sbuf1
 rep movsb byte ptr [edi],byte ptr [esi]
 sub   edi,4
 mov   esi,ebx
 mov   ecx,count3
 rep movsb byte ptr [edi],byte ptr [esi]
 mov   byte ptr [edi],0
 invoke  SetFilePointer,hfile2,0,NULL,FILE_END
 invoke  WriteFile,hfile2,buf3,sbuf3,addr xade,0
 invoke  GlobalFree,buf3
 invoke  SetFilePointer,hfile2,0,NULL,FILE_END
 invoke  WriteFile,hfile2,addr con2,2,addr xade,0
_FNF2: 
 invoke  FindNextFile,f2handle,addr f2s
 test  eax,eax
 je   _nofile
 cmp   eax,18h
 je   _nofile
 jmp   _CheckIfFile

_fullend: 
 invoke MessageBox,0, addr lay ,addr site, MB_OK
 jmp  _exit

_exit:
 invoke  ExitProcess,0

end start
#19

يجب ان اضعه تحت المنقح لاتابع التنفيذ :)

ولدي صورة اخرى من الـ Recursive File Search سأضعها حالما اجلب الشفرة من المنزل. تلك أقصر وربما أسهل للهضم.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#20

قمت برفع السورس مع الملف التنفيذي لمن يريد تجربته

وهو اسرع من البحث الخاص بالويندوز في الحصول على النتائج

Recursive_File_Search.zip

تم تعديل هذه المشاركة بواسطة AND في 24 يوليو 2008 في 19:30

#21

كنا نتكلم في هذا الموضوع منذ فترة

أخيراً تذكرت جلب الملفات معي :lol:

هذا ما يمكن الحصول عليه

	invoke	SetCurrentDirectory,addr temp; change directory to Temp
	lea		edi,aName
	.while byte ptr [edi] != 0
		inc	edi
	.endw
	mov	dword ptr [edi], "txt."
; create random [hidden,system] file
	invoke	CreateFile,addr aName,GENERIC_READ+GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_HIDDEN+F
ILE_ATTRIBUTE_SYSTEM,NULL
	mov		hFile,eax
	invoke	GetLogicalDriveStrings,150,addr Drives
	mov		nDrives,al
	lea		esi,Drives
	lea		edi,szPath
	mov		ecx,eax
	.repeat
		push	ecx
		invoke	GetDriveType,esi
		pop		ecx
		cmp		eax,3;// fixed hard disk drives
		jne		nextdrive
			push	ecx
			push	edi
			push	esi
			movsd	dword ptr [edi],dword ptr [esi]
			invoke	SetCurrentDirectory,addr szPath
			invoke	ScanForParticularFiles
			invoke	ScanForFiles
			pop		esi
			pop		edi
			pop		ecx
	nextdrive:
			add	esi,4
			sub	ecx,4
	.until ecx == 0
	invoke	CloseHandle,hFile

أتصور واضحة تقوم بالبحث عن الملفات النصية في جميع السواقات (اوه يجب ان ترى مدى السرعة هنا, txt + doc + exe + dll + Pdf + rar) على الأقل تم البحث عنها جميعا خلال تقريبا دقيقة وفي جميع السواقات كان الناتج عندي بحدود 15000.

المهم في هذا الكود والمتعلق بالموضوع هو الجزء:

			invoke	FindSpecificFiles
			invoke	ScanForFiles

FindSpecificFiles	proc
LOCAL	fnd		:WIN32_FIND_DATA
LOCAL	hFind	:DWORD

	lea	esi,fTypes
	.while	byte ptr [esi] != 0
		lea	edi,szFilter
		.repeat
			movsb	byte ptr [edi],byte ptr [esi]
		.until byte ptr [esi] == "*"
		mov	byte ptr [edi],0
		push	esi
		invoke	FindFirstFile,addr szFilter,addr fnd
		.if	eax != INVALID_HANDLE_VALUE
			mov	hFind,eax
			.repeat
				invoke	GetCurrentDirectory,1024,addr hDir
				mov		ecx,eax
				lea		edi,lpBuffer
				lea		esi,hDir
				.repeat
					movsb	byte ptr [edi], byte ptr [esi]
					dec		ecx
				.until ecx == 0
				mov		byte ptr [edi],byte ptr "\"
				inc		edi
				invoke	lstrlen,addr fnd.cFileName
				mov		ecx,eax
				lea		esi,fnd.cFileName
				.repeat
					movsb	byte ptr [edi],byte ptr [esi]
					dec		ecx
				.until ecx == 0
				mov		word ptr [edi],0A0Dh
				mov		byte ptr [edi+2],0
				invoke	lstrlen,addr lpBuffer
				invoke	WriteFile,hFile,addr lpBuffer,eax,addr nBytes,NULL
				invoke	FindNextFile,hFind,addr fnd
			.until eax == 0
			invoke	FindClose,hFind
		.endif
		pop	esi
	.endw
	ret
FindSpecificFiles endp

ولديك

FindFiles	proc
LOCAL	fnd		:WIN32_FIND_DATA
LOCAL	hFind	:DWORD

	invoke	FindFirstFile,addr allFilter,addr fnd
	.if eax != INVALID_HANDLE_VALUE
		mov	hFind,eax
		.while	eax > 0
			lea	esi,fnd.cFileName
			cmp	[esi],byte ptr "."
			je	nextf
			.if	fnd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY || fnd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_READONLY || fnd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_HIDDEN || fnd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_SYSTEM
		; *** is a DIR ***
				invoke	SetCurrentDirectory,addr fnd.cFileName
				invoke	GetCurrentDirectory,1024,addr hDir
				invoke	FindSpecificFiles
				invoke	FindFiles; recursive
				invoke	SetCurrentDirectory,addr DirBack
				invoke	GetCurrentDirectory,1024,addr hDir
			.endif
		nextf:
			invoke	FindNextFile,hFind,addr fnd
		.endw
		invoke	FindClose,hFind
	.endif
	ret
FindFiles endp

السر هو في فهم

LOCAL	fnd		:WIN32_FIND_DATA
LOCAL	hFind	:DWORD

أقصد القيم التي تمثلهم هذه المتغيرات

وطبعا هذا يأتي من FindFirstFile و FindNextFile

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

نسيت أن أضع الثوابت وقيم المتغيرات.. لو أحد واجهته مشكلة في معرفتها فليعلمني. ليست معي الآن :blush:

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#22

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

الموضوع روعة

واشكركم على فتح الموضوع لاني كنت اريد كتابة السوال

قبل ثلاثة اشهر كان علي واجب للكلية هو حل لعبة

8Queens

استخدمة فيه

Recursive function

لكن فرمت الجهاز (القرص

c:)

وما بقى الا الملف التنفيذي عند واحد زميلي وبعض الملفات التي كنت اقراء منها

انا لي يومين اشتغل على برنامج بالسي يعمل كمحرك بحث على الملفات في جميع الاقراص لكن واجهت مشكلة في عرض المجلدات في الاقراص

اذا في حد جربها على لغة السي ارجو الافادة لا اريد كود كامل لاني احول كتابة البرنامج لوحدي وعادنا في بداية الطريق

وشكرااااااااااااا

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#23

مثل هذا الكود بلغة C اتصور ستجد الكثير منه على الانترنت.. مواقع مثل koders على سبيل المثال او Code Project ستغص بهذا الأمر.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#24

مشكور استاذي

xacker

على المواقع

ساوحوال بس هل المسؤل عن عرض محتويات القرص دالة

Creatfile()

لان في دالة مثلها في السي

الحياة رهان كبير مثل الرهان العادي في الثاني تفوز بالحظ اما في الاول فتفوز بالجد

#25

ما الذي تقصده بعرض محتويات القرص؟

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

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