• Thứ Sáu, 14/01/2005 15:12 (GMT+7)

    Câu hỏi :
    Trong Visual C, có hàm nào cho biết trong một thư mục có bao nhiêu thư mục con và file, cách lấy tên của chúng, sửa tên một thư mục?

    Trả lời :
    Bạn có thể dùng 2 hàm findfirst(), findnext() của thư viện io.h của ngôn ngữ C. Bạn cũng có thể dùng 2 hàm API của Windows có chức năng tương đương là FindFirstFile(), FindNextFile().
    Hàm findfirst() hay FindFirstFile() cho phép bạn tìm thông tin về phần tử đầu tiên trong thư mục thỏa mãn tiêu chuẩn tìm kiếm, còn hàm findnext(), FindNextFile() cho phép tìm phần tử kế tiếp. Bạn có thể lặp gọi chúng nhiều lần cho đến khi tìm thấy tất cả các phần tử thỏa mãn tiêu chuẩn tìm kiếm của bạn.

    Sau đây là đoạn code C dùng 2 hàm findfirst(), findnext() trong thư viện io.h để duyệt từng phần tử trong 1 thư mục nào đó:

     #include <io.h>
     ...

     // Tìm tất cả các file có mẫu qui định ("c:\data\*.*")

     void search_pattern(char *patern) {

     char buff[128], fname[9], fext[5];

     struct ffblk pblock;

     int result;

     dircnt = filecnt = 0;

     _splitpath(patern, drive, dir, pfname, pfext);

     strcpy(buff,patern);

     result = findfirst(buff,&pblock, 0xFF);

     while (!result) { // còn phần tử cần tìm

     // không xử lý label, thư mục liên quan và cha của nó

     if (strcmp(pblock.ff_name,".")==0 ||

     strcmp(pblock.ff_name,"..")==0 ||(pblock.ff_attrib & FA_LABEL))

     { result = findnext(&pblock); continue; }

     fnsplit(pblock.ff_name, buff, buff, filename, file_ext);

     if (pblock.ff_attrib & FA_DIREC) // thư mục

     // nhánh code xử lý thư mục

     dircnt++;

     } else {

     // nhánh xử lý file

     filecnt++;

     }

     // tìm phần tử kế tiếp trong thư mục

     result = findnext(&pblock);

     }

     }

     Còn sau đây là đoạn code C dùng 2 hàm FindFirstFile(), FindNextFile() trong API Windows để duyệt từng phần tử trong 1 thư mục nào đó:

     // Tìm tất cả các file có mẫu qui định ("c:\data\*.*")

     void search_pattern(char *patern){

     WIN32_FIND_DATA pblock;

     HANDLE hSearch;

     WORD dwRC;

     dircnt = filecnt = 0;

     _splitpath(patern, drive, dir, pfname, pfext);

     hSearch=FindFirstFile(patern,&pblock);

     if (hSearch!=(HANDLE) -1) dwRC=1; else dwRC=0;

     while (dwRC) { // còn phần tử

     if ((pblock.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {

     // nhánh code xử lý thư mục

     dircnt++;

     } else {

     // nhánh xử lý file

     filecnt++;

     }

     FindClose(hSearch);

     }
     
    Chuyên mục: Lập trình