你在createfile的时候试试使用
FILE_SHARE_WRITE, NULL,OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING|
FILE_FLAG_WRITE_THROUGH,
NULL);

解决方案 »

  1.   

    不行就加个SetTimer,不停的检测。
      

  2.   

    这个可能用api解决不了的,要看底层驱动是怎么实现的
      

  3.   

    你的程序是服务程序吗?如果是,这样尝试:1、在服务初始化时调用 RegisterDeviceNotification 登记设备通知;2、在服务退出清理时调用 UnregisterDeviceNotification 取消设备通知;3、在服务的控制回调函数里处理设备通知事件:DWORD ServiceCtrlEx( DWORD dwCtrlCode, DWORD dwEventType,LPVOID lpEventData,LPVOID lpContext)
    {
    PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lpEventData;
    if (dwCtrlCode==SERVICE_CONTROL_DEVICEEVENT)
    {
    switch(dwEventType)
    {
    case DBT_DEVICEARRIVAL: // 设备已启用
    // 你的代码
    break;
    case DBT_DEVICEREMOVECOMPLETE: // 设备已卸载
    // 你的代码
    break;
    }
    }
    return NO_ERROR;
    }
      

  4.   

    我的程序是一个直接读取USB外置硬盘扇区数据的程序.
    当外置硬盘通过usb界面连接到电脑上时,就启动该程序进行扇区数据的读取,并通过一定的算法播放出内容来.
    问题就发生在,我读取用的API是readfile()这个函数,并对其有个判断,如果返回非0值就说明出问题了(比如硬盘坏了,或被拔了).
    但是在实际的测试中,如果在这个判断里加个调试断点的话,读取过程中拔掉硬盘,有时候要等大约10秒左右,才会停在断点上.有时候又一拔就停在断点上,反应时快时慢.
    我想,既然会停在断点上,就说明错误反馈一定是这个readfile()函数产生的,但是为什么反应的时间会时快时慢呢?
      

  5.   

    ReadFile是一个通用的读取设备内容的API,它有很多可选项,在你的这种情况下应该使用重叠IO模式来读取,在OVERLAPPED结构里传递一个自定义的事件句柄并记录下来,在服务控制回调函数里如果发现设备已卸载,则手工设置这个事件为信号状态,这样你的ReadFile会马上返回,返回后判断是否属于设备卸载引起的