跟我学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个X
    if (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可以用来创建不同的临时文件名,但它有不少的限制,所以这里就不再介绍了,有感兴趣的可以自行查找相关的资料即可。

五、总结

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值