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 }
相关文章
相关标签/搜索