前言:unix下除了有實實在在的文件外,還可以創建臨時的文件和目錄,這里介紹兩個創建臨時文件的函數,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; }
運行效果如下: