Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: hàm sao chép forder

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mặc định hàm sao chép forder

    mình có biết 1 vài hàm để sao chép tập tin nhưng sao chép forder thì không rõ,tìm trong sách cũng không thấy nói
    -> mình có cách như thế này nhưng xem chừng không ổn lắm
    đầu tiên tạo forder giống hệt
    bằng lệnh
    BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
    sau đó lần lượt sao chép từng file vào
    BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    làm vậy đúng rồi, chương trình explorer của win cũng làm vậy mà, ko còn cách nào hày hàm nào nữa đâu.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    làm vậy đúng rồi, chương trình explorer của win cũng làm vậy mà, ko còn cách nào hày hàm nào nữa đâu.
    híc,thế hóa ra là đúng ah,nhưng cái khó nhất là tớ không biết trong forder có file nào đâu mà copy,muốn thế có lẽ phải đi khảo sát trong foder,nhưng tớ không biết làm cách nào để khảo sát nó
    Đã được chỉnh sửa lần cuối bởi AlexF : 13-09-2008 lúc 10:53 AM. Lý do: forder

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Dùng cặp hàm FindFirstFile và FindNextFile để duyệt file. Hàm duyệt file nên thiết kế theo kiểu đệ quy, hễ gặp file thì sao chép, gặp Folder thì gọi đệ quy tiếp.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Visual C++ Code:
    1. #include<windows.h>
    2. #include<iostream.h>
    3. void search_pattern(char *patern);
    4. int main()
    5. {
    6.     search_pattern("C:\\A");
    7. }
    8. void search_pattern(char *patern)
    9. {
    10.  
    11.     // thí d? patern = 'c:\windows\*.*'
    12.     // khai báo các bi?n c?c b? ph?c v? duy?t th? m?c
    13.     WIN32_FIND_DATA pblock;
    14.     HANDLE   hSearch;
    15.     WORD dwRC;
    16.    // tìm ph?n t? ??u th?a pattern
    17.    hSearch=FindFirstFile(patern,&pblock);
    18.    if (hSearch!=(HANDLE) -1)
    19.       dwRC=1;
    20.    else
    21.       dwRC=0;
    22.    // l?p x? lý t?ng ph?n t? tìm ???c
    23.    while (dwRC)
    24.    {
    25.         // còn ph?n t?
    26.         if ((pblock.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
    27.         {
    28.                 CopyFile(   [COLOR="Red"]//--> lam the nao de sao chep file khi khong biet ten [/COLOR]cua no
    29.                 //x? lý file tìm ???c,
    30.                 //thông tin v? file ???c ch?a trong bi?n record pblock.
    31.         }
    32.         else
    33.         {
    34.                search_pattern(ten file con) [COLOR="Red"]//lam the nao de tim duoc ten cua file[/COLOR] con cua no
    35.                //x? lý th? m?c con tìm ???c,
    36.                //thông tin v? th? m?c con ???c ch?a trong bi?n record pblock.
    37.         }
    38.         // tìm ph?n t? k? ti?p trong th? m?c
    39.         dwRC=FindNextFile(hSearch,&pblock);
    40.    }
    41.    FindClose(hSearch);
    42.    cout<<dem;
    43. }
    mình có tìm được giải thuật để khảo sát file rồi,nhưng khó nhất là khi tìm ra file hoặc folder thì mình không biết lấy tên hay đường dẫn của file hoặc folder để cho vào hàm CopyFile hoặc hàm đệ quy

    Visual C++ Code:
    1. #include<windows.h>
    2. #include "iostream"
    3. #include "stdio.h"
    4. using namespace std;
    5. void copyfolder(char folder_copy[20],char folderpaste[20]);
    6. int main()
    7. {
    8.     copyfolder("C:\\A","D:\\D");
    9.     return 0;
    10. }
    11. void copyfolder(char folder_copy[20],char folderpaste[20])
    12. {
    13.     //cac thanh phan cua ham _splitpath
    14.     char tendia[4],suotdo[1024],tenfolder[10],nhandang[10];
    15.     //tach duong dan ra cac thanh phan la ten o dia,dau //,ten folder va nhan dang file
    16.     _splitpath(folder_copy, tendia, tenfolder, tenfolder, nhandang);
    17.  
    18.     char duongdanmoi[30];
    19.     //xay dung lai duong dan moi
    20.     sprintf(duongdanmoi,"%s%s*.*",tendia,tenfolder);
    21.     WIN32_FIND_DATA dulieu;
    22.     HANDLE hSearch;
    23.     WORD danhdau;
    24.     hSearch=FindFirstFile(duongdanmoi,&dulieu);
    25.     if (hSearch!=(HANDLE) -1)
    26.         danhdau=1;
    27.     else
    28.         danhdau=0;
    29.     char tenfile[20],dangfile[10];
    30.     while (danhdau)
    31.     {
    32.         //tach ten file tim duoc ra nhan dang va ten that
    33.         _splitpath(dulieu.cFileName, duongdanmoi, duongdanmoi, tenfile,dangfile);
    34.         if (dulieu.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    35.         {
    36.             // thanh phan tim duoc la thu muc,ta se xet tiep
    37.            
    38.             sprintf(duongdanmoi,"%s%s%s\\%s%s",tendia,suotdo, dulieu.cFileName, tenfolder, nhandang);
    39.            
    40.             copyfolder(duongdanmoi,"D:\\");
    41.         }
    42.         else
    43.         {
    44.             //neulafile
    45.             char duongdanfile[30];
    46.             sprintf(duongdanfile,"%s%s",tenfolder, nhandang);
    47.                 // xây dung duong dan de copy
    48.                
    49.             sprintf(duongdanmoi,"%s%s%s",tendia,suotdo,dulieu.cFileName);
    50.             CopyFile(duongdanmoi,"D:\\D",true);    
    51.            
    52.         }
    53.         //phan tu ke tiep
    54.         danhdau=FindNextFile(hSearch,&dulieu);
    55.     }
    56. }

    mình đã sửa nhưng không chạy được,bực mình quá,hic
    mình định copy 1 folder C:\\A
    sang bên D:\\D
    nhưng không copy được file nào

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định code sao chép forder trong VC++

    Code bạn viết lung tung khó hiểu quá, mình cho bạn code khác chạy ngon hơn :

    Visual C++ Code:
    1. #include <windows.h>
    2.  
    3. void GetBitArray(DWORD Number, int BitArray[32])
    4. {
    5.     DWORD tmp = Number;
    6.  
    7.     for (int i=0;i<32;i++)
    8.         BitArray[i] = 0;
    9.  
    10.     i = 0;
    11.     while (tmp > 0)
    12.     {
    13.         BitArray[i++] = (tmp % 2);
    14.         tmp /= 2;
    15.     }
    16. }
    17.  
    18. void CopyFolder(const char *SourcePath,const char *DestPath)
    19. {
    20.     char SearchStr[1000];
    21.     char SourcePath2[1000], DestPath2[1000];
    22.     WIN32_FIND_DATA FindData;
    23.     int bits[32];
    24.  
    25.     cout<<"Coying from \""<<SourcePath<<"\" to \""<<DestPath<<"\""<<endl;
    26.     CreateDirectory(DestPath,NULL);
    27.  
    28.     lstrcpy(SearchStr,SourcePath);
    29.     lstrcat(SearchStr,"\\*.*");
    30.  
    31.     HANDLE hSearch = FindFirstFile(SearchStr,&FindData);
    32.    
    33.     if (hSearch != INVALID_HANDLE_VALUE)
    34.     {
    35.         while (FindNextFile(hSearch,&FindData))
    36.         {          
    37.             if (FindData.cFileName[0] != '.')
    38.             {
    39.                 lstrcpy(SourcePath2,SourcePath);
    40.                 lstrcat(SourcePath2,"\\");
    41.                 lstrcat(SourcePath2,FindData.cFileName);
    42.  
    43.                 lstrcpy(DestPath2,DestPath);
    44.                 lstrcat(DestPath2,"\\");
    45.                 lstrcat(DestPath2,FindData.cFileName);
    46.  
    47.                 GetBitArray(FindData.dwFileAttributes,bits);
    48.                 if (bits[4])
    49.                 {
    50.                     CopyFolder(SourcePath2,DestPath2);
    51.                 }
    52.                 else
    53.                 {
    54.                     cout<<"Coying from \""<<SourcePath2<<"\" to \""<<DestPath2<<"\""<<endl;
    55.                     CopyFile(SourcePath2,DestPath2,false);
    56.                 }
    57.             }
    58.         }
    59.     }
    60.  
    61.     FindClose(hSearch);
    62.  
    63. }
    64.  
    65. int main(int argc, char* argv[])
    66. {
    67.     CopyFolder("c:\\abc","d:\\abc");
    68.  
    69.     return 0;
    70. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    OK,cảm ơn mèo nha,mình hiểu rồi,bài của mình sai vì lẽ ra hàm _splitpath dùng để phân tích đường dẫn file thì lại dùng để phân tích thư mục,hihi
    nhưng mình cũng muốn hỏi mèo luôn là cái hàm
    Visual C++ Code:
    1. void GetBitArray(DWORD Number, int BitArray[32])
    2. {
    3.     DWORD tmp = Number;
    4.  
    5.     for (int i=0;i<32;i++)
    6.         BitArray[i] = 0;
    7.  
    8.     i = 0;
    9.     while (tmp > 0)
    10.     {
    11.         BitArray[i++] = (tmp % 2);
    12.         tmp /= 2;
    13.     }
    14. }
    cậu dùng để phân tích ra cái nào là thư mục cái nào là file thì ngoài cách xây dựng đó còn cách nào để biết cái nào là file cái nào là thư mục nữa không thế

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi coder_gate Xem bài viết
    OK,cảm ơn mèo nha,mình hiểu rồi,bài của mình sai vì lẽ ra hàm _splitpath dùng để phân tích đường dẫn file thì lại dùng để phân tích thư mục,hihi
    nhưng mình cũng muốn hỏi mèo luôn là cái hàm
    Visual C++ Code:
    1. void GetBitArray(DWORD Number, int BitArray[32])
    2. {
    3.     DWORD tmp = Number;
    4.  
    5.     for (int i=0;i<32;i++)
    6.         BitArray[i] = 0;
    7.  
    8.     i = 0;
    9.     while (tmp > 0)
    10.     {
    11.         BitArray[i++] = (tmp % 2);
    12.         tmp /= 2;
    13.     }
    14. }
    cậu dùng để phân tích ra cái nào là thư mục cái nào là file thì ngoài cách xây dựng đó còn cách nào để biết cái nào là file cái nào là thư mục nữa không thế
    Mình nghĩ chắc là còn, nhưng mình chỉ biết mỗi cách đó thôi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Code bạn viết lung tung khó hiểu quá, mình cho bạn code khác chạy ngon hơn :

    Visual C++ Code:
    1. #include <windows.h>
    2.  
    3. void GetBitArray(DWORD Number, int BitArray[32])
    4. {
    5.     DWORD tmp = Number;
    6.  
    7.     for (int i=0;i<32;i++)
    8.         BitArray[i] = 0;
    9.  
    10.     i = 0;
    11.     while (tmp > 0)
    12.     {
    13.         BitArray[i++] = (tmp % 2);
    14.         tmp /= 2;
    15.     }
    16. }
    17.  
    18. void CopyFolder(const char *SourcePath,const char *DestPath)
    19. {
    20.     char SearchStr[1000];
    21.     char SourcePath2[1000], DestPath2[1000];
    22.     WIN32_FIND_DATA FindData;
    23.     int bits[32];
    24.  
    25.     cout<<"Coying from \""<<SourcePath<<"\" to \""<<DestPath<<"\""<<endl;
    26.     CreateDirectory(DestPath,NULL);
    27.  
    28.     lstrcpy(SearchStr,SourcePath);
    29.     lstrcat(SearchStr,"\\*.*");
    30.  
    31.     HANDLE hSearch = FindFirstFile(SearchStr,&FindData);
    32.    
    33.     if (hSearch != INVALID_HANDLE_VALUE)
    34.     {
    35.         while (FindNextFile(hSearch,&FindData))
    36.         {          
    37.             if (FindData.cFileName[0] != '.')
    38.             {
    39.                 lstrcpy(SourcePath2,SourcePath);
    40.                 lstrcat(SourcePath2,"\\");
    41.                 lstrcat(SourcePath2,FindData.cFileName);
    42.  
    43.                 lstrcpy(DestPath2,DestPath);
    44.                 lstrcat(DestPath2,"\\");
    45.                 lstrcat(DestPath2,FindData.cFileName);
    46.  
    47.                 GetBitArray(FindData.dwFileAttributes,bits);
    48.                 if (bits[4])
    49.                 {
    50.                     CopyFolder(SourcePath2,DestPath2);
    51.                 }
    52.                 else
    53.                 {
    54.                     cout<<"Coying from \""<<SourcePath2<<"\" to \""<<DestPath2<<"\""<<endl;
    55.                     CopyFile(SourcePath2,DestPath2,false);
    56.                 }
    57.             }
    58.         }
    59.     }
    60.  
    61.     FindClose(hSearch);
    62.  
    63. }
    64.  
    65. int main(int argc, char* argv[])
    66. {
    67.     CopyFolder("c:\\abc","d:\\abc");
    68.  
    69.     return 0;
    70. }
    dùng hàm GetFileAttributes có thể xác định được đâu là folder đâu là file
    vừa test lại,bài của mèo con mà copy các file hay folder có chứa chữ tiếng việt thì chịu nè,hehe
    Đã được chỉnh sửa lần cuối bởi AlexF : 25-11-2008 lúc 08:57 AM.

Các đề tài tương tự

  1. Tính sizeof forder
    Gửi bởi le.usau trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 26-06-2011, 11:26 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn