前言:Linux下除了有实实在在的文件外,还可以创建临时的文件和目录,这里介绍两个创建临时文件的函数,tmpfilef和mkstemp,以及创建临时目录的函数mkdtemp。这三个函数具体用法如下。
一、创建一个无名的临时文件,程序退出时关闭临时文件
(1)头文件 #include <stdio.h>
(2)函数原型 FILE *tmpfile(void);
(3)返回值
成功:返回一个文件流
失败:NULL,没有创建临时文件
注意:tmpfile创建的临时文件只能读取一次,读取之后里面的内容就没有了
具体代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXLINE 1029
int main(int argc,char *argv[])
{
char tempname[100] = "hello";
char line[MAXLINE]; //L_tmpnam是定义在头文件<stdio.h>中
FILE *fp;
char buf[100];
fp = tmpfile(); //创建临时文件
fputs("one line output",fp); //把数据写到临时文件流中
rewind(fp); //重置流到文件头
fgets(line,sizeof(line),fp); //从临时文件流中读取数据
fgets(buf,sizeof(buf),fp); //tmpfile创建的临时文件只能读取一次,读取之后里面的内容就没有了
printf("%s\n",line);
printf("%s\n",buf);
//fputs(line,stdout); //输出数据
return 0;
}
运行结果如下:
从图中的显示结果可知道验证了这句话:tmpfile创建的临时文件只能读取一次,读取之后里面的内容就没有了
二、创建一个临时文件,文件名自定义
(1)函数原型 int mkstemp(char *template);
(2)参数:
a、template:临时文件的名字,最后6个字符一定是XXXXXX,绝对不能少,记得是大写
(3)返回值:
成功:文件描述符,并创建一个临时文件,文件名是自定义的,后6个字符是系统自己填充
失败:-1
特点:这个函数创建的临时文件可以读多次,而且数据不会丢失,这是上面tmpfile函数所没有的功能
具体代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXLINE 1029
int main(int argc,char *argv[])
{
int fd;
char name[] = "/tmp/dirXXXXXX"; //后面记得加XXXXXX,并且是大写的,创建临时文件成功的时候系统会自动填充字符
char buf2[100],buf1[100] = "hello world\n";
char buf3[100];
bzero(buf3,100);
bzero(buf2,sizeof(buf2));
fd = mkstemp(name); //创建一个临时文件
if(fd == -1)
{
perror("mkstemp");
exit(1);
}
printf("temp file name is: %s\n",name);
write(fd,buf1,strlen(buf1)); //写数据到临时文件中
lseek(fd,0,SEEK_SET); //重新把文件指针偏移到文件头
read(fd,buf2,sizeof(buf2)); //从临时文件中读出数据
lseek(fd,0,SEEK_SET); //重新把文件指针偏移到文件头
read(fd,buf3,sizeof(buf3)); //可以读多次,而且数据不会丢失
printf("%s",buf3);
fputs(buf2,stdout);
return 0;
}
运行效果如下:
比较上面的函数这里的区别出来了:这个函数创建的临时文件可以读多次,而且数据不会丢失,这是上面tmpfile函数所没有的功能
好了上最后一个函数:
三、创建临时目录
(1) 函数原型 char *mkdtemp(char *template);
(2)参数:临时目录的路径,最后6个字符一定是XXXXXX,绝对不能少,记得是大写
(3)返回值:
成功:返回指向目录名的指针,创建目录成功
失败:NULL
注意:这个程序退出后不会自动从文件系统中删除目录,要用unlink函数来删除
代码如下:
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define MAXLINE 1029
int main(int argc,char *argv[])
{
char *path;
DIR *entry;
struct dirent *ep;
struct stat fileinfo;
bzero(&fileinfo,sizeof(fileinfo));
char name[] = "/tmp/dirXXXXXX";
path = mkdtemp(name); //创建一个临时目录
if(path == NULL)
{
perror("mkdtemp");
exit(1);
}
lstat(path,&fileinfo);
if(S_ISDIR(fileinfo.st_mode)) //判断是否是目录
{
printf("the file is directory\n");
}
else if(S_ISREG(fileinfo.st_mode)) //判断是否是普通文件
{
printf("the file is regular file\n");
}
printf("temp directpry name:%s\n",path);
entry = opendir(path); //打开目录
chdir(path); //进入目录
mkdir("test",0777); //创建一个名字为test的目录
int fd = open("test.txt",O_RDWR|O_CREAT,0777); //以读写权限打开一个名字为test.txt的文件,如果不存则创建
//可以在临时目录中创建文件并进行读写操作
char buf4[] = "hello world";
char buf5[100];
bzero(buf5,sizeof(buf5));
write(fd,buf4,sizeof(buf4));
lseek(fd,0,SEEK_SET); //重新把文件指针偏移到文件头
read(fd,buf5,sizeof(buf5));
printf("%s\n",buf5);
while(1)
{
ep = readdir(entry); //读目录中的文件
if(ep == NULL)
break;
printf("%s\n",ep->d_name); //打印目录中的文件名字
}
unlink(path); //解除连接,从文件系统中删除创建的临时目录
return 0;
}
运行效果如下:
关闭文件方法(remove和unlink)
1、
先关后删
os.close(fd) os.remove(fname)
fd 为文件描述符与文件对象不是一样的需要系统级别的关闭
2、
- 当remove() 中的pahtname指定为目录时,相当于调用rmdir 删除目录,
- 当remove() 中的pathname指定问文件时,相当于调用unlink 删除文件链接
所以发现remove是间接调用unlink来删除文件的目的。
使用方法
int remove(const char *pathname); // #include <stdio.h>
int unlink(const char *pathname); // #include <unistd.h> int rmdir(const char *pathname); // #include <unistd.h>