当前位置:  开发笔记 > 开发工具 > 正文

强制窗口刷新磁盘FAT

如何解决《强制窗口刷新磁盘FAT》经验,为你挑选了1个好方法。

我的磁盘上有一个单独的分区,格式化为FAT32.当我休眠窗口时,我希望能够加载另一个操作系统,创建/修改该分区上的文件,然后使Windows退出休眠状态,并能够看到我所做的更改.

我知道你要打字的是什么,"好吧,你不应该这样做!" 然后把我链接到一些关于我正在尝试做什么是错误/不可能/打破一切的规范.但是,我确信有一些方法可以解决这个问题.:)

我不需要在Windows中使用FAT32分区,除了读取那里写的文件,然后我就完成了 - 所以不管解决方案是什么,磁盘在一段时间内完全无法访问是可以接受的.不幸的是,我无法使整个物理磁盘脱机,因为它只是安装Windows的同一物理设备的分区 - 只是分区.

这些是我到目前为止尝试过的东西......

    谷歌一下.我得到了至少一个"这永远不会发生"的答案.不能的!:)

    在休眠之前卸载磁盘.从冬眠中出来后装载.这似乎没有效果.Windows仍然认为FAT与以前一样,所以我写入磁盘的任何数据都会丢失,而且我调整大小的文件都已损坏.如果任何文件被缓存,那就更糟了.

    使用DeviceIoControl来调用IOCTL_DISK_UPDATE_PROPERTIES来尝试刷新磁盘(但是分区表没有改变,所以这并没有真正做任何事情).

有没有办法使磁盘/卷读取缓存无效以强制窗口返回磁盘?

我想通过使用libfat直接打开分区和读/写并绕过缓存或者某些东西是矫枉过正的.



1> Nick..:

所以我终于找到了解决问题的方法.在我看来,我将Mount Point与Mount相关联.这些不是一回事.删除所有卷装入点不会使卷卸载.它仍然安装但不是你有一个可以在资源管理器中访问的路径.

这是开始这一切的文章.它还表明,搜索您的确切问题,而不是感知问题可以帮助很多!

所以有几个解决方案,一个是在紧密循环中不断调用NtSetSystemInformation()来设置"SYSTEMCACHEINFORMATION"属性,以便在系统进入休眠状态时基本上清空/清除缓存.然后在你出来时停止循环.对我来说,这似乎可能会影响系统性能.所以我放弃了它.

更好的是,这是MSDN文章中提出的稍微不同的问题的推荐解决方案,它提供了更好的解决问题的方法:在Hibernate中卸载卷一次/恢复许多配置

现在我有一个服务,它将刷新写缓存,然后在系统进入休眠/休眠状态时锁定和卸载卷,并在它出现时立即释放卷上的锁.

这是一些代码.OnHibernate>

volumeHandle = CreateFile(volumePath,
                          GENERIC_READ|GENERIC_WRITE, 
                          FILE_SHARE_READ|FILE_SHARE_WRITE,
                          NULL,
                          OPEN_EXISTING, 
                          FILE_ATTRIBUTE_NORMAL,
                          0 );
FlushFileBuffers( volumeHandle );
DeviceIoControl( volumeHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL ) ;
DeviceIoControl( volumeHandle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL );
//Keep the handle open here.
//System hibernates.

的onResume>

DeviceIoControl( volumeHandle, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL )
CloseHandle(volumeHandle)

希望这有助于其他人在将来:)

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有