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版本  :

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


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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值