Linux中進行單文件內容的複製

文件內容複製的常規方法:

  • 開闢一段空間,不斷讀取文件的內容並寫入另外一文件當中,這種方法好在安全,通常在類型容許的最大範圍內是安全的,缺點就是複製內容的時間長
  • 一次性複製文件的內容,這種方法必須首先獲取當前被複制的文件內容的大小,而後一次性開闢與文件內容大小相同的內存空間,一般爲了安全,都必須讓大小加1

讀取文件內容的步驟

  • 打開被複制文件(open/fopen)
  • 讀取文件內容(read/fread)--->當使用系統IO(open這一類)的時候能夠直接讀取內容,但當使用標準IO(fopen這一類)的時候,必須進行下一步
  • 標準IO讀取文件內容的時候,必須先獲取到文件內容的大小,一般使用fseek和ftell來獲取,系統IO則不用
  • 寫入另外一份文件中進行保存(write/fwrite)
  • 關閉打開的文件

具體的操做(考慮到移植性,本文章使用標準IO進行操做)

  • 使用fopen打開被複制的文件和建立一個保存的文件,並判斷是否打開或建立成功
  • 使用fseek和ftell來獲取當前複製文件的內容大小fileSize;
  • 開闢一個內存空間,建議使用動態開闢的方法,好比mallco,calloc,new等
  • 使用fread讀取被複制文件的內容,使用fwrite寫進到保存文件中
  • 使用fclose關閉上述的兩個文件

代碼顯示

 1 #include <stdio.h>
 2 
 3 int main(int argc,char *argv)  4 {  5     //以只讀的方式打開被複制的文件
 6     FILE *srcFd = fopen("./source.txt","r");  7     if(NULL == srcFd)  8  {  9         printf("open source file failed\n"); 10         return -1; 11  } 12 
13     //以讀寫的方式建立一個不存在的文件
14     FILE *dstFd = fopen("./save.txt","w+"); 15     if(NULL == dstFd) 16  { 17         printf("open save file failed\n"); 18         return -1; 19  } 20 
21     //進行獲取文件大小的操做
22     fseek(srcFd,0,SEEK_END);       //將光標移動到文件末尾
23     long fileSize = ftell(srcFd);  //獲取文件的大小
24     fseek(srcFd,0,SEEK_SET);       //將光標恢復到文件的開頭 25 
26     //開闢一個新空間(動態開闢)
27     char *dataBuf = (char *)calloc(1,fileSize+1); 28     if(NULL == dataBuf) 29  { 30         printf("calloc a memory failed\n"); 31         return -1; 32  } 33 
34     //讀取文件的內容
35     long retSize = fread(dataBuf,1,fileSize,srcFd); 36     if(retSize != fileSize) 37  { 38         printf("read file context failed\n"); 39         return -1; 40  } 41 
42     //寫入保存文件中
43     retSize = fwrite(dataBuf,1,fileSize,dstFd); 44     if(retSize != fileSize) 45  { 46         printf("write context in file failed\n"); 47         return -1; 48  } 49 
50     //關閉文件和釋放內存空間
51  fclose(srcFd); 52  fclose(dstFd); 53 
54     free(dataBuf); 55 
56     return 0; 57 }
相關文章
相關標籤/搜索