U盘,又是U盘。请问如何Flush U盘的数据?

碧螺春的马甲 2005-06-03 09:13:24
对U盘做copy file动作,如果不使用stop device这个动作,很多数据都只是在Host端的cache里。

那么,如何把这些数据flush出去?

FlushFileBuffers有用吗?他的handle是不是U盘的Disk Handle?
...全文
162 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧螺春的马甲 2005-06-06
  • 打赏
  • 举报
回复
我怎么没有找到你说的这个函数?
alphapiao 2005-06-05
  • 打赏
  • 举报
回复
答案是每一个U盘的分区都需要调用FlushLogicalNT(int nDiskNumber),
如何检查数据有没有被完全写入可以用以下方法:
调用了函数之后,非法关机,看windows是否会对U盘分区进行自检操作,如果不进行自检操作,那么就是刷缓冲成功。
alphapiao 2005-06-03
  • 打赏
  • 举报
回复
BOOL FlushLogical98(WORD nDiskNumber)
不好意思,这个函数你用不起来,因为我是用驱动实现的。
另一个函数,你可以使用。
alphapiao 2005-06-03
  • 打赏
  • 举报
回复
//把磁盘缓冲中的数据刷入硬盘。
// 盘号, 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;

}
alphapiao 2005-06-03
  • 打赏
  • 举报
回复
//把磁盘缓冲中的数据刷入硬盘。
// 盘号, 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;
}
碧螺春的马甲 2005-06-03
  • 打赏
  • 举报
回复
三楼还是用的 flushfilebuffers,如果一个U盘多个分区,是不是意味着

如果我有U盘的Handle,那么可以Flush他所有分区的数据?
碧螺春的马甲 2005-06-03
  • 打赏
  • 举报
回复
楼上说的 createfile,如果透过windows做copy动作,何来createfile no buffering?

我先用三楼的试试,谢谢两位。
koko1998 2005-06-03
  • 打赏
  • 举报
回复
应该可以吧!

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.

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧