做个带进度条的对话框,使FILE *用fread,fwrite一个字节一个字节复制,进度条一个一个增加,嘻嘻,累不累啊……

解决方案 »

  1.   

    //copy一个目录下的所有文件(每次读取最长dwReadLen)
    //m_CAll为整体进度条m_CFile为当前copy中的文件进度条(类型是:CProgressCtrl)
    AfxGetApp()->BeginWaitCursor(); TCHAR lpFileName[MAX_PATH]=_T("D:\\*.*");
    WIN32_FIND_DATA FindFileData;  // data buffer
    HANDLE hFirst=FindFirstFile(lpFileName,&FindFileData);
    LONGLONG llTotalLen=0;
    while(::FindNextFile(hFirst,&FindFileData))
    {
    llTotalLen+=(FindFileData.nFileSizeHigh * ((LONGLONG)MAXDWORD+1)) + FindFileData.nFileSizeLow;
    } hFirst=FindFirstFile(lpFileName,&FindFileData);
    DWORD dwbuf[0x00004000];
    CFile srcFile,dstFile;
    DWORD dwReadLen=sizeof(DWORD)*0x0004000,
      dwCount,dwFinish=0;
    while(::FindNextFile(hFirst,&FindFileData))
    {
    if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
    {
    CString srcFileName("D:\\");
    srcFileName+=FindFileData.cFileName;
    DWORD dwFinishInFile=0;
    LONGLONG llFileLen=(FindFileData.nFileSizeHigh * ((LONGLONG)MAXDWORD+1)) + FindFileData.nFileSizeLow;
    srcFile.Open(srcFileName,CFile::modeRead);
    CString dstFileName(FindFileData.cFileName);
    dstFileName=_T("D:\\temp\\")+dstFileName;
    dstFile.Open(dstFileName,CFile::modeWrite | CFile::modeCreate); SetDlgItemText(IDC_STATIC1,dstFileName);
    while(dwReadLen==(dwCount=srcFile.Read(dwbuf,dwReadLen)))
    {
    dstFile.Write(dwbuf,dwCount);
    dwFinish+=dwCount;
    dwFinishInFile+=dwCount;
    m_CAll.SetPos(dwFinish*100/llTotalLen);
    m_CFile.SetPos(dwFinishInFile*100/llFileLen);
    }
    dstFile.Write(dwbuf,dwCount);
    dstFile.Close();
    srcFile.Close();
    dwFinish+=dwCount;
    dwFinishInFile+=dwCount;
    m_CAll.SetPos(dwFinish*100/llTotalLen);
    m_CFile.SetPos(dwFinishInFile*100/llFileLen);
    }
    } AfxGetApp()->EndWaitCursor();