我想 让 读取文件进度和一个进度条关联起来,,请问 有没有啥方法知道 已经读取了文件的多少,或者写入了多少,
就像CopyFileEx 这个函数似的,能知道复制的进度。

解决方案 »

  1.   

    先读取文件长度,然后每次ReadFileEx回调时,计算当前读取的总长度,然后和文件的总长度一起来自己计算百分比
      

  2.   

    我这段代码没有调用 回调函数 麻烦帮我看下吧
    VOID CALLBACK FileIOCompletionRoutine(
    DWORD dwErrorCode,
    DWORD dwNumberOfBytesTransfered,
    LPOVERLAPPED lpOverlapped
    )
    {
    cout<<" fun"<<dwNumberOfBytesTransfered<<" "<<dwErrorCode<<lpOverlapped<<endl;
    }
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    SECURITY_ATTRIBUTES sa={sizeof(SECURITY_ATTRIBUTES)};
    sa.bInheritHandle=false;
    HANDLE file=CreateFile(TEXT("1.txt"), GENERIC_EXECUTE | GENERIC_READ |GENERIC_WRITE,   
     FILE_SHARE_READ | FILE_SHARE_WRITE,&sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    cin.get();
    char * buffer=new char[5000];
    srand( (unsigned)time( NULL ) );
    for(int i=0;i!=5000;i++)
    {
    buffer[i]=rand()*i%127;
    }
    OVERLAPPED tmp={0};
    WriteFileEx(file,buffer,5000,&tmp,FileIOCompletionRoutine);
    CloseHandle(file);
    return 0;
    }
      

  3.   

    CreateFile的第六个参数试试使用FILE_FLAG_OVERLAPPED标志。
    在网上找找异步文件操作的例子。
      

  4.   

    试了 ,,windows 核心编程就是这么说的,不管用,不知道哪错了
      

  5.   


    代码基本上没问题,重点就是没有一个空闲的线程能够让操作系统来处理这个回调函数。最简单就是在WriteFileEx下面加一句SleepEx(1000, TRUE); 看看
      

  6.   

    给一个简单方法,CreateFile的时候共享模式不要独占,设为可读,然后用另一个文件句柄循环取文件长度,和总长度的比就是进度,进度条一定要单独的线程否则效率极低
      

  7.   

    有没有这样的方法 就是ReadFileEX 的时候,,用 它的回调函数来确定进度,,就和CopyFileEX 类似的那种