一切皆檔案 這是我四個月前第一次接觸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);
}