C创建临时文件
前言: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 1029int 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 1029int 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>
總結
- 上一篇: asc码转换 linux_Linux终端
- 下一篇: rdd数据存内存 数据量_大数据开发-S