我拷贝一个很大的文件,我想做一个文件拷贝的进度条,我的问题是:我怎么知道自己拷贝了多少文件,已经拷贝多少比例到硬盘上来?怎么得到已经拷贝了多少文件,顺便说一下是不能够用GetDiskFreeSpaceEx()和GetDiskFreeSpace来求的。
万分感谢!

解决方案 »

  1.   

    为什么不能用GetDiskFreeSpaceEx和GetDiskFreeSpace?你可以采用多线程来解决GetDiskFreeSpaceEx和GetDiskFreeSpace的调用访问冲突
      

  2.   

    用CopyFileEx,有个回调函数,你自己查msdn吧,可以满足你的要求
    BOOL CopyFileEx(
      LPCTSTR lpExistingFileName,
      LPCTSTR lpNewFileName,
      LPPROGRESS_ROUTINE lpProgressRoutine,
      LPVOID lpData,
      LPBOOL pbCancel,
      DWORD dwCopyFlags
    );
      

  3.   

    CDirDialog dirDlg;
    if(dirDlg.DoModal()==IDOK)
    {
    CString strPath = dirDlg.GetPathname();  
    CMainFrame *pMF = (CMainFrame *)AfxGetMainWnd();
    CString str = pMF->szDataFilePath;
    str+=strbakfilename;//要备份的源文件名称;
    char FromFileName[255] ="\0";
    char ToFileName[255] ="\0";

    strcpy(ToFileName,strPath);
    if(copyfolder)
    {
    strcat(ToFileName,"\\");
    strcat(ToFileName,strbakfilename);
    strcat(ToFileName,"\\");//???
    strbakfilename+= "\\*.*";//为目录;
    strcpy(FromFileName,str);
    }else
    {
    strcpy(FromFileName,str);//要备份的源文件名称;
    strcat(ToFileName,"\\");
    strcat(ToFileName,strbakfilename);//目标文件名称; }
    strcat(FromFileName,"\0");
    strcat(ToFileName,"\0");
    SHFILEOPSTRUCT lpFileOp;
    lpFileOp.hwnd = GetSafeHwnd();
    lpFileOp.wFunc = FO_COPY;
    lpFileOp.pFrom = FromFileName;
    lpFileOp.pTo = ToFileName;
    lpFileOp.fFlags = FOF_ALLOWUNDO;
    lpFileOp.fAnyOperationsAborted = FALSE;
    lpFileOp.hNameMappings = NULL;
    lpFileOp.lpszProgressTitle = NULL;
    int rval = SHFileOperation(&lpFileOp);
    if(rval==0)
    {
        MessageBox("备份完成"); 
    CString sttemp=_T("");
    sttemp.Format("%s记录备份完成",strbakfilename);
    SaveSystemInfoData(pMF->szCurrentPath,"",sttemp.GetBuffer(0)); 
    }
    else 
    {
    MessageBox( "备份失败");
    } }
    用这个吧。人家自己会出现进度条
      

  4.   

    同意 kof99th(小虫) CopyFileEx可以!
      

  5.   

    可以用open,read,write,close这种C标准库的方式拷贝文件.自己定义缓冲大小,read,write的过程中就可以显示进度条了.还可以用MFC类库的相关类,方法很多啊
      

  6.   

    一个笨办法,用循环,先得到文件长度
    然后一次copy 1M, 直到copy 完成, 这样比例和已经拷贝的字节数就都知道了,由于是个死循环,所以如果你要刷新进度条的话还必须在循环体中调用函数DoEvents();
    void DoEvents()
    {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return;
    }
      

  7.   

    CopyFileEx有没有这样的sampecode我找不到这样的sample code
      

  8.   

    DWORD CALLBACK CopyProgress( 
    LARGE_INTEGER TotalFileSize,          // total file size, in bytes 
    LARGE_INTEGER TotalBytesTransferred,  // total number of bytes transferred 
    LARGE_INTEGER StreamSize,              // total number of bytes for this stream 
    LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream 
    DWORD dwStreamNumber,                  // the current stream 
    DWORD dwCallbackReason,                // reason for callback 
    HANDLE hSourceFile,                    // handle to the source file 
    HANDLE hDestinationFile,               // handle to the destination file 
    LPVOID lpData                          // passed by CopyFileEx 

    { //在这里更新progressbar,lpData可以传CProgress的指针。printf("%08X:%08X of %08X:%08X copied.\n",TotalBytesTransferred.HighPart,TotalBytesTransferred.LowPart,TotalFileSize.HighPart,TotalFileSize.LowPart); 
    return PROGRESS_CONTINUE; 

    int main(int argc,char **argv) 

    int Cancel=FALSE; 
    if(argc!=3) 

    printf("CopyEx Src Dst\n"); 
    return 0; 

    if(!CopyFileEx(argv[1],argv[2],(LPPROGRESS_ROUTINE)CopyProgress,NULL,&Cancel,COPY_FILE_FAIL_IF_EXISTS)) 

    printf("CopyFileEx() failed.\n"); 
    return 0; 
    } return 0; 
    }
      

  9.   

    我怎么也编译不通过的
    你inlude了什么文件?
    真的好奇怪!error C2065: 'CopyFileEx' : undeclared identifier
    error C2065: 'LPPROGRESS_ROUTINE' : undeclared identifier谢谢,帮帮忙!
      

  10.   

    #include <Winbase.h>我早就试了啊
    不行啊
    还是这样啊