1. 程式人生 > 其它 >Linux檔案操作的練習1(cp的實現)

Linux檔案操作的練習1(cp的實現)

技術標籤:嵌入式

1.實現cp指令:

首先要搞清楚的一點就是cp指令的使用方法:

cp demo1.c demo2.c  將demo1.c的內容拷貝到demo2.c中去

因此出現了一個問題就是,cp後面要緊跟著兩個引數(原檔案、新檔案),我們該怎樣實現這一功能。因此要引出main函式的引數,這個在windows下dev-c++中建立一個project的時候,其實預設給的main函式,就是帶引數argc和argv的,讓我們來寫一個test1.c檔案來看看這兩個引數代表的是什麼東西。

#include <stdio.h>

int main(int argc,char** argv)
{ printf("The number of parents:%d\n",argc); printf("No.1 parent:%s\n",argv[0]); printf("No.2 parent:%s\n",argv[1]); printf("No.3 parent:%s\n",argv[2]); return 0; }

執行結果如圖所示:
在這裡插入圖片描述
很顯然,main函式中argc代表的是引數的個數,二級指標argv是一個二維字元陣列,儲存的各個引數的名稱,根據這一知識點我們就可以開始寫我們自己的mycp了。

我的程式碼:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char** argv){
	int fdSrc,fdDes;
	if(argc < 3){
	//這裡這個雄壯性是借鑑老陳的
		printf("The number of argc is wrong!\n"
); exit(0); } fdSrc = open(argv[1],O_RDONLY); if(fd == -1){ fd = open(argv[1],O_RDWR|O_CREAT,0600); } char Rbuf[1024]; //設定一個可以讀1M的快取區 int Rtypes = read(fdSrc,Rbuf,1024); fdDes = open(argv[2],O_WRONLY); if(fdDes == -1){ fdDes = open(argv[2],O_RDWR|O_CREAT,0600); } int Wtypes = write(fdDes,Rbuf,strlen(Rbuf)); close(fdSrc); close(fdDes); return 0; }

執行結果卻出現了點小問題,這個第二行開始有亂碼:
但是
其實解決方法很簡單,只需要將 Rbuf 初始化全部為{‘\0’}就好,而且這個程式碼在“貼上”的這個過程中,如果位元組數不夠1M,不僅浪費時間,還浪費空間;而且還存在了一個bug就是,write只能去覆蓋,所以複製之後的檔案可能會有錯誤,所以通過聽完老陳的講解,我給他優化了一下:

優化後的程式碼:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char** argv){
	int fdSrc,fdDes;
	if(argc < 3){
		printf("The number of argc is wrong!\n");
		exit(0);
	}
	fdSrc = open(argv[1],O_RDONLY);
	//=================================================
	int size = lseek(fdSrc,0,SEEK_END)				//|
	lseek(fdSrc,0,SEEK_SET);						//|
	//這步必須有,否則指標在文字尾部,什麼也讀不到了   //|
	//=================================================
	if(fd == -1){
		fdSrc = open(argv[1],O_RDWR|O_CREAT,0600);
	}
	//=================================================
	char* Rbuf;										//|
	Rbuf = (char*)malloc(size * sizeof(char) + 1)	//|
	//=================================================
	int Rtypes = read(fdSrc,Rbuf,size);				//|
	fdDes = open(argv[2],O_WRONLY);
	if(fdDes == -1){
		fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
		//記住這個O_TRUNC:如果新文字有內容,就全部去掉
	}
	int Wtypes = write(fdDes,Rbuf,strlen(Rbuf));
	close(fdSrc);
	close(fdDes);
	return 0;
}