天天看点

Linux 下文件拷贝

一切皆文件  这是我四个月前第一次接触Linux时老师说的第一句话

在Linux下 对文件进行拷贝的命令是 :   cp  源文件路径    目的文件路径    

这个命令大家都很熟悉了      今天想自己实现  如何实现文件的拷贝 ;

1.1版本  : 刚着手时候的想法很朴素  就像把大象装进冰箱里的想法一样 分三步;

              step 1:  打开源文件和目的文件   (如果目的文件不存在就创建一个)   

              step 2:  读源文件  (一个字符)   写到目的文件        直到读完为止

              step 3: 关闭源文件 和 目的文件

这是我1.1版本的源代码:

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

int main()

{

 int f_in=open("/home/uesr/Desktop/file.c",O_RDWR);

 int f_out=open("/home/uesr/Desktop/file1.c",O_RDWR|O_CREAT,0666);

 char ch;

 while(read(f_in,&ch,1))

 {

  write(f_out,&ch,1);

 }

 close(f_in);

 close(f_out);

 exit(0);

}

 很简单  是不是?这个版本存在的问题是 :   必须前提要求给的路径都是简单的文件名  或者使完整的路径   负责在step1 就会失败  然而我当时还没有对打开失败做处理机制

2.1版本  :

         加入  文件打开失败的处理机制 , 如果目的文件只有路径   将源文件的文件名找到  作为目的文件的文件名   这是我的部分代码截图  :

Linux 下文件拷贝

2.1版本编译运行测试又有问题了  当我源文件不是完整路径的时候 仍然报错    2.1版本也并不通用

3.1版本:

           首先判断源文件给的到底是文件名  还是路径       再针对不同的情况 作不同的处理      

最终3.1版本测试成功!  无论第一个参数是源文件名  还是 源文件的完整地址+文件名    也无论第二个参数是 目的文件名 还是目的文件的不完整路径   都可以成功拷贝

当然  如果源文件没有文件名的话  就根本不知道要去拷贝谁了    这种不诚心的拷贝  只能报错了 。

接下来附上完整的代码,  如果还有什么问题 望批评指正!

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

#include <string.h>

#include <assert.h>  int main(int  argc,char *argv[])

{

 if(argc<3)

 {

  printf("input error!\n");

  exit(0);

 }

 int f_in=open(argv[1],O_RDONLY);

 assert(f_in!=-1);

 int f_out=open(argv[2],O_WRONLY|O_CREAT,0666);

 if(f_out==-1)

 {

  char name[128];

  char *n=name;

  strcpy(n,argv[2]);

  n+=strlen(name);

  strcpy(n,"/");

  n++;

  strcpy(n,argv[1]);

  f_out=open(name,O_WRONLY|O_CREAT,0666);

  if(f_out==-1)

  {

   int j;

   for(j=0;j<strlen(name);j++)

   {

    name[j]='\0';

   }

   n=name;

   strcpy(n,argv[2]);

   char *s=argv[1];

   s=s+strlen(argv[1])-1;

   n+=strlen(name);

   int i;

   for(i=strlen(argv[1]);i>0;i--,s--)

   {

    if(*s=='/')

    {

     strcpy(n,s);

     break;

    }

   }

 // printf("%s\n",name);

   f_out=open(name,O_WRONLY|O_CREAT,0666);

   assert(f_out!=-1);

  }

 }

 char ch;

 while(read(f_in,&ch,1))

 {

  write(f_out,&ch,1);

 }

 close(f_in);

 close(f_out);

 exit(0);

}

继续阅读