对U盘做copy file动作,如果不使用stop device这个动作,很多数据都只是在Host端的cache里。那么,如何把这些数据flush出去?FlushFileBuffers有用吗?他的handle是不是U盘的Disk Handle?

解决方案 »

  1.   

    //把磁盘缓冲中的数据刷入硬盘。
    // 盘号, 0=A:, 1=B:, 2=C:, ... 
    //对物理磁盘对象无效
    BOOL FlushLogical98(WORD nDiskNumber)
    {
    DWORD  dwBytesReturned; WORD dwReturn;
     
    if(g_hDevice==INVALID_HANDLE_VALUE)
    {
    return 0;
    } if(!DeviceIoControl(
    g_hDevice,IOCTL_SAMSYS_FLUSH_LOGICAL,
    &nDiskNumber,sizeof(WORD),
    (LPVOID)&dwReturn,
    sizeof(dwReturn),
    &dwBytesReturned,NULL ))
    {
    return 0; //error to access vxd.
    } return dwBytesReturned; 
    }
      

  2.   

    //把磁盘缓冲中的数据刷入硬盘。
    // 盘号, 0=A:, 1=B:, 2=C:, ... 
    //对物理磁盘对象无效
    BOOL FlushLogicalNT(int nDiskNumber)
    {
    HANDLE fht;
    BOOL bret=FALSE;
    char buf[20];
    strcpy(buf,"\\\\.\\C:");
    buf[4]='A'+nDiskNumber; int i =0 ;

    // sprintf(buf,"\\\\.\\PHYSICALDRIVE%d",i);  对物理盘无效。 fht=CreateFile(buf,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);
    if(fht==INVALID_HANDLE_VALUE)
    {
    bret=  FALSE;
    }

    if(fht!=INVALID_HANDLE_VALUE) 
    {
    if(FlushFileBuffers(fht)==FALSE)
    {
               bret=FALSE;
    }
    else
    {
    bret=TRUE;
    }
    } if(fht!=INVALID_HANDLE_VALUE)
    CloseHandle(fht); return bret;}
      

  3.   

    BOOL FlushLogical98(WORD nDiskNumber)
    不好意思,这个函数你用不起来,因为我是用驱动实现的。
    另一个函数,你可以使用。
      

  4.   

    应该可以吧!To open a file for unbuffered I/O, call the CreateFile function with the FILE_FLAG_NO_BUFFERING flag. This prevents the file contents from being cached. However, the file metadata may still be cached. To flush the metadata to disk, use FlushFileBuffers.
      

  5.   

    楼上说的 createfile,如果透过windows做copy动作,何来createfile no buffering?我先用三楼的试试,谢谢两位。
      

  6.   

    三楼还是用的 flushfilebuffers,如果一个U盘多个分区,是不是意味着如果我有U盘的Handle,那么可以Flush他所有分区的数据?
      

  7.   

    答案是每一个U盘的分区都需要调用FlushLogicalNT(int nDiskNumber),
    如何检查数据有没有被完全写入可以用以下方法:
    调用了函数之后,非法关机,看windows是否会对U盘分区进行自检操作,如果不进行自检操作,那么就是刷缓冲成功。