天天看點

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

}

繼續閱讀