-
15-04-2011, 04:21 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hàm tìm kiếm tất cả các file loại trừ một số thư mục?
Dear all,
Em đang code 1 function list all file trong ổ C:\ và write ra file C:\filelist.txt, dùng 2 API FindFirstFile() và FindNextFile() kết hợp với thuật toán recursive. Code đã hoàn tất như sau :
Mã:void find(char* path) { static int found =0; FILE *filehandle = fopen("C:\\filelist.txt", "a"); HANDLE fh; WIN32_FIND_DATA wfd; int i=0; int j=0; fh=FindFirstFile(path,&wfd); if(fh) { char full_path[350]; if (strcmp(wfd.cFileName,".")!=0) { for (int i = 0; i < strlen(path)-3; i++) full_path[i] = path[i]; full_path[strlen(path)-3]='\0'; strcat(full_path,wfd.cFileName); fputs (full_path,filehandle); fputs (" ",filehandle); } while(FindNextFile(fh,&wfd) && found ==0) { if (strcmp(wfd.cFileName,"..")!=0) { for (int i = 0; i < strlen(path)-3; i++) full_path[i] = path[i]; full_path[strlen(path)-3]='\0'; strcat(full_path,wfd.cFileName); fputs (full_path,filehandle); fputs (" ",filehandle); } if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp(wfd.cFileName,"..")!=0 && strcmp(wfd.cFileName,".")!=0) { path[strlen(path)-3]='\0'; strcat(path,wfd.cFileName); strcat(path,"\\*.*"); find(path); } } if(found==0) { for(i=strlen(path)-1;i>0;i--) { if(j==1 && path[i]=='\\') { path[i]='\0'; strcat(path,"\\*.*"); break; } if(path[i]=='\\') j=1; } } } FindClose(fh); fclose(filehandle); }
Do đó em muốn sửa file hàm find trên sao cho khi list file nếu đó là thư mục có path là "C:\System Volume Information" thì bỏ wa và tiếp tục list tiếp. Em sửa code như sau :
Mã:void find(char* path) { static int found =0; FILE *filehandle = fopen("C:\\filelist.txt", "a"); HANDLE fh; WIN32_FIND_DATA wfd; int i=0; int j=0; fh=FindFirstFile(path,&wfd); if(fh) { char full_path[350]; if (strcmp(wfd.cFileName,".")!=0) { for (int i = 0; i < strlen(path)-3; i++) full_path[i] = path[i]; full_path[strlen(path)-3]='\0'; strcat(full_path,wfd.cFileName); fputs (full_path,filehandle); fputs (" ",filehandle); } while(FindNextFile(fh,&wfd) && found ==0) { if (strcmp(wfd.cFileName,"..")!=0) { for (int i = 0; i < strlen(path)-3; i++) full_path[i] = path[i]; full_path[strlen(path)-3]='\0'; strcat(full_path,wfd.cFileName); fputs (full_path,filehandle); fputs (" ",filehandle); } if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp(wfd.cFileName,"..")!=0 && strcmp(wfd.cFileName,".")!=0) { path[strlen(path)-3]='\0'; strcat(path,wfd.cFileName); if(strcmp(path, "C:\\System Volume Information")) continue; strcat(path,"\\*.*"); find(path); } } if(found==0) { for(i=strlen(path)-1;i>0;i--) { if(j==1 && path[i]=='\\') { path[i]='\0'; strcat(path,"\\*.*"); break; } if(path[i]=='\\') j=1; } } } FindClose(fh); fclose(filehandle); }
Best Regards,View more random threads:
- Xin Y Kien Anh Em ve Auto Hook ko dung HC_ACTION
- Tính số Icon Trong 1 File exe ?
- Địa Chỉ BroadCast Trong Máy Chủ Là Windows 7
- Hook Keyboard trên Firefox. Giúp mình?
- Gọi hàm trong process và tìm địa chỉ của hàm đó từ 1 process khác như thế nào ?
- Antivirus lấy các hàm API trong PE File bằng cách nào
- Xin hướng dẫn hook địa chỉ bộ nhớ games
- Viết chương trình Paint thông minh?
- Làm thế nào để liên kết các hàm đã export trong 1 dll. (proxy function )
- Hỏi về Hook IAT ?
-
16-04-2011, 08:02 AM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Vietwow viết lại đi, code của em lung tung lắm, if while nhảy lung tung, bug, chậm, lỗi overwrite memory nhiều lắm. Anh cũng tính optimize lại cho em, nhưng thôi, để em tự làm.
Hồi xưa anh review code cho các coder khác của công ty, code vầy là anh bắt xóa bỏ hết, viết lại cái mới, không sữa, không workaround, chắp vá.
Em dùng hàm FindFirstFindEx thay cho FindFirstFile, sẽ gọn đi nhiều đấy.
-
16-04-2011, 12:44 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Dạ, em sẽ xem thêm hàm FindFirstFindEx(). Còn viết lại nguyên hàm find thì chắc em chịu vì trình hiện tại em chỉ biết 1 cách như trên thôi anh (dùng 2 API search kết hợp với recursive), em sẽ cố gắng search docs thêm xem sao. Nếu a còn cách khác thì nhờ a gợi mở để e mày mò thêm. Cám ơn anh TQN và các bạn khác rất nhiều vì chịu khó follow giúp đỡ em mấy topic vừa qua [IMG]images/smilies/biggrin.png[/IMG]
Best Regards,
-
16-04-2011, 02:30 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hệ thống Help2 trên máy anh đang bị hư, mày mò vừa RCE Help2 API (\Program Files\Common Files\Microsoft Shared\Help\hxds.dll, \Program Files\Common Files\Microsoft Shared\Help\hxvz.dll, \Program Files\Common Files\Microsoft Shared\Help\ITIRCL55.DLL, dexplore.exe) vừa monitor, mà vẫn chưa được. Mà install lại thì no, nhứt quyết không install lại, phải tìm tại sao không còn help collection nào.
Vì vậy anh phải lên MSDN Online đọc, và sorry anh đã có lỗi sai về return value của FindNextFile.
Nếu mục đích của vietwow chỉ là write tất cả file name vào filelist.txt thì code trên của em sẽ chỉ còn gần một nữa. Bỏ luôn cái compare "System Volume..." gì đó luôn, code như vậy là tệ lắm, nếu ở ổ D, E, F.. thì sao, nếu thư mục khác cũng có security attribute như nó thì sao.
Cố lên thử xem nhé. Đã làm thì phải làm cho được, làm cho tốt, không làm tạm bợ.
Lúc trước anh đã có lần nói: ct run được thì chưa chắc là ct tốt, chỉ 30-50% thôi. Chỉ cần tốt nhất theo mình là được rồi.
-
16-04-2011, 03:59 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Em code kiểm tra sai trị return value của FindFirst và FindNext. Nó return INVALID_HANDLE_VALUE khi failed, chứ không phải NULL.
Sữa lại:
Mã:fh=FindFirstFile(path,&wfd);if (INVALID_HANDLE_VALUE != fh)...........while ((INVALID_HANDLE_VALUE != FindNextFile(fh,&wfd)) && (0 == found)).........
-
16-04-2011, 07:21 PM #6Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mã:if(strcmp(path, "C:\\System Volume Information")) continue;
Mã:if(!strcmp(path, "C:\\System Volume Information")) continue;
-
16-04-2011, 07:52 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi birthis
-
17-04-2011, 08:22 AM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Dear anh TQN,
Hàm find() em sẽ cố gắng tìm cách viết lại theo lời a suggest để improve khả năng code. Nhưng hiện tại em gặp 1 lỗi rất quái nên chắc phải nhờ anh hay các bạn nào có khả năng debug xem giúp giùm. Tình hình hiện tại code em (chưa optimize lại hàm find) đã chạy ok, nó list all file name ra fille "C:\filelist.txt" và đọc filename từ file đó ra rùi md5 (dùng chương trình m5dsums mới, ko phải chương trình bị lỗi tham số lần trước nha anh) và write output ra "C:\output.txt". Em run code qua VS 2010 (chức năng Ctrl + F5 - Run Without Debugging) thì ok, check C:\output.txt thấy ok :
Mã:c059d45d0fec1e833b1ad9a64c06cbd7 *192.168.10.5.txt c059d45d0fec1e833b1ad9a64c06cbd7 *192.168.10.6.txt c059d45d0fec1e833b1ad9a64c06cbd7 *192.168.12.7.txt
Mã:c059d45d0fec1e833b1ad9a64c06cbd7 *192.168.10.5.txt Press ENTER to exitc059d45d0fec1e833b1ad9a64c06cbd7 *192.168.10.6.txt Press ENTER to exitc059d45d0fec1e833b1ad9a64c06cbd7 *192.168.12.7.txt Press ENTER to exit
Để tiện, em xin up nguyên project lên :
http://www.mediafire.com/?lxww96910nqazml
kèm theo link ctrinh md5sums em sử dụng : http://www.pc-tools.net/win32/md5sums/
Để test lẹ, em đã comment đi hàm find(), do đó chỉ cần tạo ra file C:\filelist.txt với nội dung là 3 path file trong ổ C:\, vd :
Mã:C:\1\192.168.10.5.txt C:\1\192.168.10.6.txt C:\1\192.168.12.7.txt
Hy vọng anh hay airỗi xem qua giúp em tý, emdebug cả ngày rùi vẫn chưa biết tại sao Thanx
Best Regards,
-
17-04-2011, 01:03 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hic, ai rãnh giúp em debug cái này cái, bữa giờ em mò hoài vẫn ko ra [IMG]images/smilies/dont_know.gif[/IMG]
-
17-04-2011, 01:15 PM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Tối qua anh đã debug thử code của em, bug nhiều lắm, stack bị corrupt lung tung.
Vài lỗi nặng: strtok return NULL thì sao, fgets failed thì sao, buffer 300 chắc chắn đủ không ?
Thấy code của em như vậy, anh thấy em nên chịu khó viết lại, chia nhỏ ra thành từng hàm nhỏ, test kỹ từng hàm đó với mọi dạng dữ liệu, mọi đầu vào, mọi path có thể xảy ra.
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...