读写文件与进程退出或者掉电问题
2012-09-07 02:16
316 查看
其实CFile封装的是API,ReadFile和WriteFile
调用这两个API时是不会立即进行磁盘操作的,除非你在CreateFile时使用了FILE_FLAG_NO_BUFFERING。
一般情况下,WriteFile会先把数据写到内存的缓冲中,然后定时定量,按需写入硬盘。由于硬盘的设计原理,一次性写入硬盘的字节数必须等于一个磁道在一个扇区内的容量大小(也就是Windows所说的簇)的整数倍。CFile的Flush操作封装的是FlushFileBuffers,它会强制将内存中缓冲的数据写入硬盘,其实在CloseHandle的时候系统会做同样的动作。
如果在Flush之后掉电,系统可以保证所有需要写入的数据已经递交到硬盘,但是硬盘确不能保证。因为硬盘为了提高效率也设有缓存,现在主流硬盘的缓冲是2M。如果你在大量写入数据之后,缓存就会堆积一定量准备写入硬盘的数据,但这是非常快的,因为从硬般缓存到磁盘是硬盘的内部传输,一般2M的数据不会超过0.5秒。所以,在Flush操作后再等待1秒中后断电因该是安全的。
调用这两个API时是不会立即进行磁盘操作的,除非你在CreateFile时使用了FILE_FLAG_NO_BUFFERING。
一般情况下,WriteFile会先把数据写到内存的缓冲中,然后定时定量,按需写入硬盘。由于硬盘的设计原理,一次性写入硬盘的字节数必须等于一个磁道在一个扇区内的容量大小(也就是Windows所说的簇)的整数倍。CFile的Flush操作封装的是FlushFileBuffers,它会强制将内存中缓冲的数据写入硬盘,其实在CloseHandle的时候系统会做同样的动作。
如果在Flush之后掉电,系统可以保证所有需要写入的数据已经递交到硬盘,但是硬盘确不能保证。因为硬盘为了提高效率也设有缓存,现在主流硬盘的缓冲是2M。如果你在大量写入数据之后,缓存就会堆积一定量准备写入硬盘的数据,但这是非常快的,因为从硬般缓存到磁盘是硬盘的内部传输,一般2M的数据不会超过0.5秒。所以,在Flush操作后再等待1秒中后断电因该是安全的。
相关文章推荐
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- 解决安卓style文件中设置Activity退出动画无效或者被干扰的问题
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- spark Driver进程不退出导致的临时文件爆盘问题
- 读写文件时,文件被另外进程占用的问题
- daemon进程中文件读写注意的一些问题
- daemon进程中文件读写注意的一些问题
- 关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。
- C# 中使用Image.FromFile(string path)后,提示该文件正在被另一进程使用XXX的问题
- c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
- 解决linux 百度网盘大文件不能下载或者速度慢问题
- 在浏览器将网页中的附件或者文件链接保存至本地时(比如ATUlog无法下载),文件名字变为乱码问题
- import sun.audio.AudioPlayer(或者其它文件)的问题
- java 读取配置文件或者图片文件,然后打jar包的问题
- Linux进程打开文件数太多(too many open files)的问题
- 进程文件: dllhost 或者 dllhost.exe
- c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
- hadoop文件系统访问权限修改延迟,或者是权限更新延迟,权限缓存问题
- 在Java中简单的读写log或者txt文件内容