当前位置: 首页 > 科技观察

Windows系统下,如何读写临时文件

时间:2023-03-13 04:16:39 科技观察

测试代码FILE_ATTRIBUTE_NORMAL属性FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE属性在之前的项目中,一些文件在部署到设备时被压缩。但是在运行阶段需要解压的时候,基于文件安全和读写效率的考虑,不想把解压后的内容存放在硬盘上,所以寻找解决方案。首先想到的是:临时文件系统。在Linux系统中,创建一个临时文件系统非常简单,执行如下命令即可:mount-ttmpfs-osize=1024mtmpfs/mnt/tmp挂载成功后,/mnt/挂载点下创建的所有文件tmp将是一个临时文件,也就是说:当计算机关闭时,这些文件就消失了。这样做的好处是:不需要硬盘I/O操作,读写速度非常快!那么,在Windows系统中应该用什么方法来达到类似的目的呢?有很多第三方软件可以创建内存文件系统(RamDisk),搜索了一下,感觉这些独立的工具有点大材小用。在研究的过程中,发现在Windows中,在创建文件时,有2个很棒的属性可以达到预期的目的:FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE不多说了,直接上代码测试!测试代码#includevoidtestTempFile(void){do{//创建文件,注意文件属性HANDLEhFile=CreateFile("hello.txt",GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,//或者将其替换为以下行//FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE,NULL);if(hFile==INVALID_HANDLE_VALUE){DWORDret=GetLastError();printf("CreateFileError.ret=%d\n",ret);break;}//将一些数据charbuff写入文件[32]={0};DWORDdwWrite;for(inti=0;i<100;i++){memset(buff,0,32);sprintf(buff,"hello%05d\n",i);printf("写入%s\n",buff);if(!WriteFile(hFile,&buff,strlen(buff),&dwWrite,NULL)){printf("WriteFileerror\n");break;}//休眠一会,以便我们管理资源在浏览器中观察Sleep(1000);}//关闭文件句柄CloseHandle(hFile);}while(0);}为了观察被操作的文件hello.txt在程序执行过程中,我们每次向文件写入数据后,休眠1秒。CreateFileAPI参数说明:HANDLECreateFile(LPCSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);官方对FILE_ATTRIBUTE_NORMAL属性的说明:这个应该是开发过程中最常用的属性了测试一下:写的过程中可以用编辑器打开hello.txt文件。而且每次打开它,都可以看到实时数据。即操作系统立即将内存缓冲区中的内容刷新到硬盘中。FILE_ATTRIBUTE_TEMPORARY|FILE_FLAG_DELETE_ON_CLOSE属性先看官方对FILE_ATTRIBUTE_TEMPORARY的描述:理解:系统尽量(内存容量)将写入文件的数据尽量保存在RAM中。只有当内存压力比较大的时候,才会写入硬盘。再看下一个属性:FILE_FLAG_DELETE_ON_CLOSE,官方说明:理解:当文件句柄关闭时,硬盘中的文件会立即被删除。测试记录:程序向文件写入数据时,在资源管理器中可以看到文件名,但是文件大小为0,用编辑器打开时,报错:文件无法打开,意思是该应用程序已独占该文件。程序执行CloseHandle()后,资源管理器中的hello.txt文件自动删除。在一些特殊的使用场景下,这样的功能还是很有帮助的。以上知识点小分享,希望能在某个时候给大家带来不一样的思路!本文转载自微信公众号“IOT物联网小镇”,可通过以下二维码关注。转载本文请联系物联小镇公众号。