wpcockroach

导航

Win32临时文件和CreateFile

在Windows程序设计中,你迟早会遇到使用临时文件的时候。所谓临时文件,一个最简单的例子就是安装程序的安装日志。在程序运行过程中,如果没有发生任何的问题,完全可以在程序安装完成后,把日志文件删除。

如果要自行设计和实现这逻辑方法也许有很多,比较典型的方法应该有两种:

一种是通过CreateFile创建一个普通的文件(FILE_ATTRIBUTE_NORMAL),然后通过WriteFile写文件。如果中间没有发生什么错误,在程序退出时调用CloseHandle和DeleteFile来完成关闭文件句柄并删除文件的目的。

另外一种方法就是通过CreateFile自带的一些属性来做这件事情。

CreateFile的函数签名是:CreateFile(LPCTSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD dwFlagsAndAttributes, HANDLE)。其中的dwFlagsAndAttributes有一个属性和一个标志位可以帮我们实现同样的效果。他们是FILE_ATTRIBUTE_TEMPORARY和FILE_FLAG_DELETE_ON_CLOSE。

Specifying the FILE_ATTRIBUTE_TEMPORARY attribute causes file systems to avoid writing data back to mass storage if sufficient cache memory is available, because an application deletes a temporary file after a handle is closed. In that case, the system can entirely avoid writing the data. Although it does not directly control data caching in the same way as the previously mentioned flags, the FILE_ATTRIBUTE_TEMPORARY attribute does tell the system to hold as much as possible in the system cache without writing and therefore may be of concern for certain applications.

FILE_FLAG_DELETE_ON_CLOSE: The file is to be deleted immediately after all of its handles are closed, which includes the specified handle and any other open or duplicated handles.

FILE_ATTRIBUTE_TEMPORARY是一个cache策略的标志位,简单说就是尽可能以内存作为存储数据的地方,而不是磁盘或者其他物理存储器,以减少磁盘等的I/O。而FILE_FLAG_DELETE_ON_CLOSE,则自动帮我们做了DeleteFile的操作。

一眼望过去,就可以感觉到这个方案明显方便了,并且性能上也有提升的可能!

通过第二种解决方案,我们就可以在临时文件夹下创建出这么一个文件。当一切顺利的情况下,CloseHandle就可以了。如果有异常发生了,那么只要做一次CopyFile的操作就可以了。临时文件夹下的那个文件任何时候都会自动删除掉。

最后说一点关于FILE_FLAG_DELETE_ON_CLOSE的MSDN描述。貌似immediately的表述是不正确的,我在用的时候发现CloseHandle后,文件没有被删除。文件是在程序退出后才自动消失的。

posted on 2013-05-21 23:58  wpcockroach  阅读(2831)  评论(0编辑  收藏  举报