当前位置: 首页 > news >正文

跟我学C++中级篇——程序中的临时文件的处理

一、临时文件

临时文件大家都知道,有些数据需要短暂保存一下,这种临时文件其实没啥大用。然尔正是其没啥大用,有些场景下恰恰需要。比如一些不重要的日志数据,一些缓存的中间文件等等。这些数据最终会生成可持久化的数据或很快会变得无用,那么这些临时文件就没作用了,会在一定条件触发将其删除。
不同的平台上,临时文件的处理位置有所不同,但基本上都可以一眼看出。一般常见的临时文件的位置如下:
Windows平台:C:\Users<用户名>\AppData\Local\Temp
Apple平台:/private/var/folders/和~/Library/Caches/
Linux平台:/tmp/和/var/tmp/

二、开发时如何处理临时文件

在开发时如果遇到需要处理临时文件时,有多种的处理方法,最简单的方法是自己操作传统的文件系统的API写到指定的位置(包括系统tmp文件夹)中,并在合适的条件下对其进行删除;但这样做有一个问题,不同的平台可能路径的处理不一样,就会让维护者或应用者感到不好管理,所以在常见的库中都提供了专门操作临时文件的接口,比如tmpfile函数和mkstemp、mkdtemp函数。前者创建的临时文件不需要开发者手动维护会在文件流关闭或程序终止时自动删除;而后者创建的临时文件夹和临时文件,需要开发者自己手动处理。
这和原来学过的堆和栈的处理方式有些相似。

三、临时文件的应用场景

临时文件的作用其实很大,经常用到的场景如下:
1、缓存(Cache):浏览器、软件缓存临时数据提高处理速度(如网页的Cookie、照片、视频等)
2、程序运行的中间状态:软件安装包解压、文档编辑时的自动保存文件、计算的中间数据、大文件的分段下载时的小文件等
3、系统和用户的临时数据:OS更新备份、日志以及进程间通过文件交互等
临时文件在应用过程中已经暴露了非常多的问题,主要有:
1、隐私泄露:浏览器的Cookie、缓存和历史记录等
2、浪费存储:大量的不能及时删除的临时文件占据了不少的硬盘空间,比如Windows的C盘经常会因为临时文件而暴红
3、系统应用:不小心删除某些临时文件会让系统应用出错,比如在编译一个较大工程时删除临时文件,可能导致编译错误

四、实例分析

#include <stdio.h>
#include <stdlib.h>int main() {FILE *tmp = tmpfile();if (tmp == NULL) {return -1;}fprintf(tmp, "test temp data.\n");rewind(tmp);char buf[100];if (fgets(buf, sizeof(buf), tmp) != NULL) {printf("read buf: %s", buf);}fclose(tmp);return 0;
}

再看一下使用mkstemp和 mkdtemp函数创建临时目录和临时文件:

//临时文件夹
#include <iostream>
#include <cstdlib>
#include <sys/stat.h>  // mkdir权限
#include <cstring>int main() {char tmpDirName[] = "/tmp/dir_XXXXXX";  // 模板尾部须含6个Xif (mkdtemp(tmpDirName) == nullptr) {return 1;}std::cout << "temp path: " << tmpDirName << std::endl;rmdir(tmpDirName);  return 0;
}
//临时文件
#include <iostream>
#include <cstdlib>
#include <unistd.h>   
#include <cstring>   int main() {char tmpName[] = "/tmp/testFile_XXXXXX"; int fd = mkstemp(tmpName);  if (fd == -1) {perror("mkstemp failed");return 1;}const char* content = "test data!\n";write(fd, data, strlen(content));close(fd);unlink(tmpName);return 0;
}

其实在C库中还有一个函数tmpnam可以用来创建不同的临时文件名,但它有不少的限制,所以这里就不再介绍了,有感兴趣的可以自行查找相关的资料即可。

五、总结

临时文件就是一个应用处理的中间态,一般情况下,这种中间态是不稳定的,所以临时文件往往意味着随时有可能会被清理。开发者要善于运用这种状态达到自己的一些设计目的,但千万不要在这种临时文件中一时兴起写一些重要的数据。
开发者也要有一双善于发现美的眼睛!

相关文章:

  • [原创](现代C++ Builder 12指南): [4]如何使用VCL的TStringBuilder?
  • Java 网络编程性能优化:高吞吐量的实现方法
  • MAC-QueryWrapper中用的exists,是不是用join效果更好
  • 【OSG学习笔记】Day 4: 相机与视口——控制观察视角
  • 生成对抗网络(Generative adversarial network——GAN)
  • 深度学习相关技术
  • 在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置
  • 《汽车理论》第四章作业MATLAB部分
  • 第 28 场 蓝桥月赛
  • C++ MySQL数据库访问工具类设计与操作流程详解
  • gbase8s之线程状态详解(超值)
  • 提示词构成要素对大语言模型跨模态内容生成质量的影响
  • chili3d调试笔记5 直接加入js和大模型对话 trae
  • windows上部署本地知识库(RAG)ollama + docker + ragflow方案
  • 组装一台intel n95纯Linux Server服务器
  • RBF(径向基神经网络)基础解析与代码实例:拟合任意函数
  • Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
  • HBuilder X:前端开发的终极生产力工具
  • 【C语言】srand() rand seed其实是设置一个初始值
  • 百级Function架构集成DeepSeek实践:Go语言超大规模AI工具系统设计
  • 俄外长:俄将在不损害伙伴关系前提下发展对美关系
  • 北京发布今年第四轮拟供商品住宅用地清单,共计5宗22公顷
  • 跟着京剧电影游运河,京杭大运河沿线六城举行京剧电影展映
  • 吕国范任河南省人民政府副省长
  • 报告显示2024年全球军费开支增幅达冷战后最大
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏