1. 程式人生 > >c語言實現cp命令

c語言實現cp命令

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