阅读:4322回复:21
磁盘读写缓冲问题
我修改ramdisk做了个虚拟磁盘(该设备为PCI接口的存储设备,掉电后可保存数据),但在写完文件时(此时
文件复制进度对话已消失),对系统断电,再重启后发现文件并没完全写入,出现文件丢失或损坏.之后跟踪驱 动程序发现,在文件复制进度对话已消失时还在写磁盘,要过一段时间才能完全写入(此时间据文件大小不定, 一般要过5秒以上),应该是文件系统缓冲引起的,请问各位大虾有什么解决办法让文件在文件复制进度对话 框消失就要完全写入磁盘??在虚拟盘驱动层能不能实现?? |
|
最新喜欢:looksa... |
沙发#
发布于:2007-04-27 10:07
flush一下就可以了
|
|
|
板凳#
发布于:2007-04-27 10:29
多谢兄台回复,但怎么知道文件复制完成?什么时候flush?好象只能在应用层flush,因为只是写了驱动,在驱动层怎么实现??好像实现不了啊,虚拟盘驱动在文件系统与CACHE管理层下
|
|
地板#
发布于:2007-04-27 11:34
写个文件系统过滤驱动,在打开虚拟设备上的文件的时候强行加上WRITE_THROUGH标志。
|
|
地下室#
发布于:2007-04-27 11:59
Try:
IRP_MJ_PNP/IRP_MN_QUERY_CAPABILITIES/DEVICE_CAPABILITIES::EjectSupported/Removable/SurpriseRemovalOK IOCTL_STORAGE_GET_HOTPLUG_INFO |
|
|
5楼#
发布于:2007-04-27 15:54
引用第4楼rayyang2000于2007-04-27 11:59发表的“”: 貌似2k不支持 |
|
6楼#
发布于:2007-04-27 16:07
问一句,在ntfs格式下,$mft文件中的常驻内存部分在不是卸载磁盘的时候有办法刷新么?
|
|
7楼#
发布于:2007-04-27 16:58
试过了IRP_MN_GET_CAPABILITES和IOCTL_STORAGE_GET_HOTPLUG_INFO,也还是没什么变化
|
|
8楼#
发布于:2007-04-28 11:19
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
9楼#
发布于:2007-04-28 11:40
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
10楼#
发布于:2007-04-28 13:42
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
11楼#
发布于:2007-04-29 12:04
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
|
|
12楼#
发布于:2007-04-29 13:09
引用第6楼xx_qiang于2007-04-27 16:07发表的“”: flush 根目录 |
|
13楼#
发布于:2007-04-29 14:08
软驱应该不缓冲吧,要不拿出软盘文件就丢了,它怎么实现?
|
|
14楼#
发布于:2007-04-29 15:24
引用第12楼tooflat于2007-04-29 13:09发表的“”: 能不能在详细一点? |
|
15楼#
发布于:2007-04-29 20:17
如果软驱不缓冲的话,有什么方法让文件系统把我的虚拟盘当软区一样不缓冲写入,仅仅将MediaType指定为软驱应该不行吧??
|
|
16楼#
发布于:2007-05-05 23:36
lz...你一定不懂得怎样彻底刷新缓存,在FSFD的IRP_MJ_CLEANUP例程中
|
|
17楼#
发布于:2007-05-17 19:18
虚拟盘驱动中IoGetCurrentIrpStackLocation(Irp得到的FileObject无效,FileObject我用IoGetDeviceObjectPointer得到了,但在虚拟盘驱动中调用CcFlushCache时出现Page fault错误,不知什么原因.
我还有个方法是HOOK ZwCreateFile,当操作自己的虚拟盘时强行加上FILE_NO_INTERMEDIATE_BUFFERING,但在虚拟盘中创建文件夹和文件是提示"参数错误",无法创建,但是可以创建文本文挡,只强行加上FILE_WRITE_THROUGH没问题,但好象还是会缓冲.兄台是否知道是什么原因,有没有解决的方法?? |
|
18楼#
发布于:2007-05-18 08:31
建议测试一下Explorer在写完文件时(此时文件复制进度对话已消失),对系统断电,再重启后看文件是否正常
如果Explorer也是这样,我个人认为没必要管这个问题 另:FILE_NO_INTERMEDIATE_BUFFERING是要求512对齐的 |
|
|
19楼#
发布于:2007-05-18 09:39
引用第18楼looksail于2007-05-18 08:31发表的 : 但是我的目的就是要断电保护(文件复制进度对话消失后断电),好象还有个函数ZwFlushBuffersFile ,但自己声明 NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock ); 编译时出错:error LNK2001: unresolved external symbol __imp__ZwFlushBuffersFile@8 怎么才能用这个函数?? 实在不行的话就只有在应用层做个定时刷新(FlushFileBuffers)程序了!但盘符是动态分配的,不是很好处理,多个设备时,生成的每个磁盘都得刷新,占资源 |
|
上一页
下一页