天天看點

Linux指令cp源代碼C語言實作(跟cp指令效果完全一樣!)

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
void main(int argc, char * argv[] )
{
	FILE * source = fopen(argv[1],"r");
	if(source==NULL)
	{
		perror ("file no exsit!\n");
		return ;
	}
	else
	{
		struct stat * statbuf=(struct stat *)malloc(sizeof(statbuf));
		stat(argv[2], statbuf); //判斷目标路徑是一個普通檔案還是一個目錄
		if(S_ISDIR (statbuf->st_mode)) //目标是個目錄
		{
				int i,j,k=0;
				//因為目标路徑是一個檔案夾,是以預設拷貝一個和源檔案名字一樣的名字
				//要找到源檔案的名字,就要找源路徑最後一個'/'後面的字元串就是源檔案名!!
				for(i=strlen(argv[1])-1;i>=0;i--)
				{
					if(argv[1][i]=='/') //找到了最後一個'/'的下标
					{
						break; //找到就退出 ,保留'/'下标為i
					}
				}
				char source_file_name[128]={};//用來存儲源檔案的名字
				for(j=i+1;j<strlen(argv[1]);j++)
				{	//把源路徑最後一個'/'後面的字元串給source_file_name,它就是源檔案名字
					source_file_name[k++]=argv[1][j];
				}
				//如果目标路徑最後面沒有‘/’,則需要加一個'/'
				if(argv[2][strlen(argv[2])-1]!='/') 
				{
					strcat (argv[2],"/");
				}
				//把目标路徑和源檔案名拼接起來,成為一個目标檔案名,并建立打開它
				FILE * target = fopen(strcat (argv[2],source_file_name),"w+");
				while(!feof(source))
				{	//把源檔案内容全部傳給目标檔案
					char  buf[10]={};
					fread (buf,1,10,source); 
					fwrite (buf,1,10, target);
				}	
					fclose (target);
		}
		else//目标路徑是個檔案
		{
			FILE * target = fopen(argv[2],"w+");
			while(!feof(source))
			{//把源檔案内容全部傳給目标檔案
				char  buf[10]={};
				fread (buf,1,10,source);
				fwrite (buf,1,10, target);
			}	
				fclose (target);
		}
		fclose (source);
	}
}


           

繼續閱讀