c語言實現cp命令
阿新 • • 發佈:2018-11-04
#include<stdio.h> #include<unistd.h> #include<errno.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<sys/types.h> #include<string.h> //Function: //實現的cp功能 可以從檔案複製到指定資料夾下 但是沒有實現帶引數cp //另外如果多次複製並不會提示是否兩者都儲存,直接刪除原檔案重新複製 //另外注意在資料夾下建立的檔案可能帶有資料夾鎖,導致下一次複製訪問該檔案失敗 int main(int argc, char *argv[]) { int fd,fd1,size; int readnumber,writenumber; struct stat statbuf,statbuf1; char tempor[1024]; if(argc != 3) { printf("please enter the right source and destination:\n"); return 0; } fd = open(argv[1],O_RDONLY,777); if(fd < 0) { perror("open wrong!"); return 0; } //怎樣事先判斷檔案的大小呢 //這裡有個好方法 用stat結構讀取 stat(argv[1],&statbuf); size = statbuf.st_size; readnumber = read(fd,tempor,size); printf("you have read %d words \n",readnumber); //若輸入的第二個是一個資料夾的路徑,怎麼寫呢? fopen不是系統呼叫函式,使用的話內外核切換浪費很大 //如果目標檔案是一個目錄,那麼我的方法是將其資料夾路徑補全為一個檔案路徑*/ stat(argv[2],&statbuf1); //這裡有一個錯誤,就是不進行判斷,直接都走else了,但是我真的累了,找不出來 if(S_ISDIR(statbuf1.st_mode) != 0) { //這裡注意當第一個引數不是路徑而只是一個檔案的時候的情況 if(S_ISDIR(statbuf.st_mode))//等於0的話是檔案 { char ch = '/'; char *q = strrchr(argv[1],ch); printf("%s\n", q); strcat(argv[2],q);//連線字串函式,即自動將路徑補全了 }else { char *p = "/"; strcat(argv[2],p); strcat(argv[2],argv[1]); } } } chmod(argv[2],S_IRUSR|S_IWUSR); printf("%s\n",argv[2] ); fd1 = open(argv[2],O_WRONLY|O_CREAT,777); //注意這裡若檔案存在的話會報錯,原因ubuntuyou 資料夾鎖,創造的檔案只能讀,修改一下許可權就好了 if(fd1 < 0) { perror("open wrong!"); return 0; } writenumber = write(fd1,tempor,readnumber); printf("you have write %d words \n",writenumber); close(fd); close(fd1); return 0; }