创建临时文件 tmpnam tmpfile tempnam mkstemp unlink

来源:互联网 发布:115年费会员淘宝 2017 编辑:程序博客网 时间:2024/06/13 19:29

推荐使用 tmpfile mkstemp

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>intmain(void){  FILE *pfile,*pfile2;  int fileSize, readSize;  char * fileBuff = NULL;  char buff[128] =    { 0 };<strong>/****************(1)  tmpfile()  *****************/</strong> pfile2= tmpfile(); if(pfile2 == NULL)   {     fputs("creat temp file error",stderr);     exit(1);   }if( EOF == fputs("tmpfile function create me !",pfile2))  {    fputs("write err.\n",stderr);    exit(1);  }rewind(pfile2); // positions the stream stream at the beginning of the filefgets(buff,sizeof(buff),pfile2);puts(buff);<strong>/********************(2) tmpnam()  + unlink() *****************/</strong>memset(buff,0,sizeof(buff));puts(tmpnam(buff));  /*************read or write file***************/  pfile = fopen(buff, "a+");  unlink(buff);  if(pfile == NULL )    {      fputs("open error", stderr);            exit(1);    }  if (sizeof("11111111")  !=  fwrite("11111111", sizeof(char), sizeof("11111111") / sizeof(char),  pfile))    {      fputs("write error", stderr);      exit(1);    }//get the file size  fseek(pfile, 0, SEEK_END);  fileSize = ftell(pfile);  rewind(pfile);  printf("filesize:%d\n", fileSize);  fileBuff = (char *) malloc(sizeof(char) * fileSize);  if (fileSize != (readSize = fread(fileBuff, sizeof(char), fileSize, pfile)))    {      fputs("Read error", stderr);      exit(3);    }  else    {      printf("readContent: %s  \nreadsize:%d\n",fileBuff,readSize);    }  fclose(pfile);  free(fileBuff);  <strong>/********************(3) fopen() and unlink() **************/</strong>  pfile=NULL;  pfile=fopen("/tmp/tempA.txt","w+");  if(pfile == NULL )    {      fputs("create file failed.",stderr);      exit(1);    }  fputs("fopen create me",pfile);  rewind(pfile);  if( fgets(buff,sizeof(buff),pfile) == NULL )    {      fputs("read file error.\n",stderr);      exit(1);    }  fputs(buff,stdout);  fclose(pfile);  unlink("/tmp/tempA.txt");  puts("\nDONE.......\n");  return EXIT_SUCCESS;}


 

int mkstemp(char *template);

mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。

建立唯一临时文件名, template须以数组形式声明而非指针形式. 

template格式为: template.XXXXXX. 最后6位必须为XXXXXX, 前缀随意
函数返回一个文件描述符,如果执行失败返回-1。
在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
下面是一个使用mkstemp的例子:
int main(void){int fd;char temp_file[]="tmp_XXXXXX";/*Creat a temp file.*/if((fd=mkstemp(temp_file))==-1){printf("Creat temp file faile./n");exit(1);}/*Unlink the temp file.*/unlink(temp_file);close(fd);}


 

原创粉丝点击