阅读:2028回复:15
磁盘读写缓冲问题
我修改ramdisk做了个虚拟磁盘(该设备为PCI接口的存储设备,掉电后可保存数据),但在写完文件时(此时
文件复制进度对话已消失),对系统断电,再重启后发现文件并没完全写入,出现文件丢失或损坏.之后跟踪驱 动程序发现,在文件复制进度对话已消失时还在写磁盘,要过一段时间才能完全写入(此时间据文件大小不定, 一般要过5秒以上),应该是文件系统缓冲引起的,请问各位大虾有什么解决办法让文件在文件复制进度对话 框消失就要完全写入磁盘??在虚拟盘驱动层能不能实现??[p:1] |
|
沙发#
发布于:2007-04-27 11:32
这是文件系统控制的,虚拟盘驱动层无法处理。
|
|
板凳#
发布于:2007-04-28 11:27
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
地板#
发布于:2007-04-28 11:43
再问一下,用filemon看到文件已关闭能表明文件已从缓冲区写入磁盘吗,如果这时关闭电源文件再丢失可能是我虚拟盘驱动的问题吗,我的理解是此时也不一定完全写入磁盘,因为filemon文件过滤驱动在文件系统和缓冲管理之上,不知道是不是这样的
|
|
地下室#
发布于:2007-04-28 17:33
你想想windows下,向U盘写数据时,都需要点击安全移除才能保证数据完整。。。
|
|
|
5楼#
发布于:2007-04-28 17:35
文件关闭并不代表缓冲中数据已经写入磁盘。
|
|
|
6楼#
发布于:2007-04-28 17:35
文件关闭不代表缓冲已经写入磁盘。
|
|
|
7楼#
发布于:2007-04-29 12:01
软驱应该不缓冲吧,它怎么实现的
|
|
8楼#
发布于:2007-04-29 14:07
软驱应该不缓冲吧,它怎么实现的
|
|
9楼#
发布于:2007-04-29 17:36
在文件系统驱动这一层,软驱是作特殊处理的,往软驱写数据,是不缓冲的。
|
|
|
10楼#
发布于:2007-04-29 20:07
有什么方法可以让文件系统把我的虚拟盘当做软驱操作,紧紧将MediaType指定为软驱应该不行吧??
|
|
11楼#
发布于:2007-04-30 00:02
用ZwFlushBuffersFile强制缓存写进磁盘。
|
|
|
12楼#
发布于:2007-04-30 09:00
引用第4楼alphapiao于2007-04-28 19:33发表的“”: 没有必要。一般做的好的移动设备,在Windows中的Policy都是Optimize for quick removal。只有那种做的烂的设备,因为某些原因,比如一些SCSI没有处理好,才会设置为Optimize for performance,这种设备才会有cache,拔除的时候才需要“安全移除”。还有种情况是你手动更改了Policy。 |
|
|
13楼#
发布于:2007-05-17 19:19
虚拟盘驱动中IoGetCurrentIrpStackLocation(Irp得到的FileObject无效,FileObject我用IoGetDeviceObjectPointer得到了,但在虚拟盘驱动中调用CcFlushCache时出现Page fault错误,不知什么原因.
我还有个方法是HOOK ZwCreateFile,当操作自己的虚拟盘时强行加上FILE_NO_INTERMEDIATE_BUFFERING,但在虚拟盘中创建文件夹和文件是提示"参数错误",无法创建,但是可以创建文本文挡,只强行加上FILE_WRITE_THROUGH没问题,但好象还是会缓冲.兄台是否知道是什么原因,有没有解决的方法?? |
|
14楼#
发布于:2007-05-17 20:42
引用第11楼zzzevazzz于2007-04-30 00:02发表的 : 在驱动中用声明: NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock ); 编译时出错:error LNK2001: unresolved external symbol __imp__ZwFlushBuffersFile@8 该如何使用?? |
|
15楼#
发布于:2007-05-18 11:44
extern "C"
NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( ... |
|
|