創建臨時文件和目錄


前言: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; 
    
}

運行效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM