新聞中心
基于C語(yǔ)言的簡(jiǎn)單cp命令實(shí)現(xiàn)?
main函數(shù)的參數(shù),就是命令執(zhí)行時(shí),傳給程序的參數(shù),一般兩個(gè),一個(gè)是整數(shù),表示傳入?yún)?shù)的個(gè)數(shù),一個(gè)是字符串?dāng)?shù)組,傳入的參數(shù),都是字符串,命令行輸入時(shí)用空格分隔。
我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、雞西梨樹(shù)ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的雞西梨樹(shù)網(wǎng)站制作公司
可以用system(ls)命令,生成目錄名稱,突出到文件,通過(guò)字符處理,查看文件屬性,對(duì)于目錄,執(zhí)行下一級(jí)cp,對(duì)于一般文件,按二進(jìn)制文件讀寫復(fù)制。
C語(yǔ)言實(shí)現(xiàn)CP指令
用C實(shí)現(xiàn)的步驟是:
1、解析命令,就是提取出源路徑和目標(biāo)路徑,以及文件名。
2、寫一個(gè)切換目錄的函數(shù),比如chgdir(char *),路徑名字做參數(shù)。
3、執(zhí)行切換目錄函數(shù),正確執(zhí)行后,在這個(gè)目錄下找到目標(biāo)文件,定義一個(gè)緩沖區(qū),把文件內(nèi)容拷貝進(jìn)去,找不到文件另作處理。
4、再調(diào)用2步驟中的目錄切換函數(shù),在目標(biāo)路徑下建立一個(gè)空文件并把緩沖區(qū)內(nèi)容寫進(jìn)去,保存。
c語(yǔ)言中cp是什么意思
cp在c語(yǔ)言中沒(méi)有特別的含義
在linux系統(tǒng)中,它是一個(gè)命令行程序,作用是copy文件
next;而是np=cp->next;delete cp;cp=n'>c語(yǔ)言為什么不用cp=cp->next;而是np=cp->next;delete cp;cp=n
cp是一個(gè)指針,如果直接用cp的next賦值給cp,cp原來(lái)指向的內(nèi)存地址就無(wú)法釋放,造成內(nèi)存泄漏。
linux中cp命令如何用 C語(yǔ)言實(shí)現(xiàn)
1,首先需要了解cp的原理。
2,可以參考cp的源碼去了解其原理
3,cp命令的源碼可以在linux內(nèi)核中找到。
4,或者下載busybox其中也會(huì)有cp的源碼
只有了解其原理之后才能談如何實(shí)現(xiàn)。參考代碼如下:
#include?stdio.h
#include?stdlib.h
#include?sys/stat.h
#include?sys/types.h
#include?fcntl.h
#include?errno.h
#include?unistd.h
#include?string.h
#define?BUF_SIZE?1024
#define?PATH_LEN?128
void?my_err(char?*err_string,?int?line?)
{
fprintf(stderr,"line:%d?",line);
perror(err_string);?
exit(1);
}
void?copy_data(const?int?frd,const?int?fwd)
{
int?read_len?=?0,?write_len?=?0;
unsigned?char?buf[BUF_SIZE],?*p_buf;
while?(?(read_len?=?read(frd,buf,BUF_SIZE))?)?{
if?(-1?==?read_len)?{
my_err("Read?error",?__LINE__);
}
else?if?(read_len??0)?{?//把讀取部分寫入目標(biāo)文件
p_buf?=?buf;
while?(?(write_len?=?write(fwd,p_buf,read_len))?)?{
if(write_len?==?read_len)?{
break;
}
else?if?(write_len??0)?{?//只寫入部分
p_buf?+=?write_len;
read_len?-=?write_len;
}
else?if(-1?==?write_len)?{
my_err("Write?error",?__LINE__);
}
}
if?(-1?==?write_len)?break;
}
}
}
int?main(int?argc,?char?**argv)?
{
int?frd,?fwd;?//讀寫文件描述符
int?len?=?0;
char?*pSrc,?*pDes;?//分別指向源文件路徑和目標(biāo)文件路徑
struct?stat?src_st,des_st;
if?(argc??3)?{
printf("用法?./MyCp?源文件路徑?目標(biāo)文件路徑\n");
my_err("arguments?error?",?__LINE__);
}
frd?=?open(argv[1],O_RDONLY);
if?(frd?==?-1)?{
my_err("Can?not?opne?file",?__LINE__);
}
if?(fstat(frd,src_st)?==?-1)?{
my_err("stat?error",__LINE__);
}
/*檢查源文件路徑是否是目錄*/
if?(S_ISDIR(src_st.st_mode))?{
my_err("略過(guò)目錄",__LINE__);
}
pDes?=?argv[2];
stat(argv[2],des_st);
if?(S_ISDIR(des_st.st_mode))?{?//目標(biāo)路徑是目錄,則使用源文件的文件名
len?=?strlen(argv[1]);
pSrc?=?argv[1]?+?(len-1);?//指向最后一個(gè)字符
/*先找出源文件的文件名*/
while?(pSrc?=?argv[1]??*pSrc?!=?'/')?{
pSrc--;
}
pSrc++;//指向源文件名
len?=?strlen(argv[2]);?
//?.?表示復(fù)制到當(dāng)前工作目錄
if?(1?==?len??'.'?==?*(argv[2]))?{
len?=?0;?//沒(méi)有申請(qǐng)空間,后面就不用釋放
pDes?=?pSrc;
}
else?{?//復(fù)制到某目錄下,使用源文件名
pDes?=?(char?*)malloc(sizeof(char)*PATH_LEN);
if?(NULL?==?pDes)?{
my_err("malloc?error?",?__LINE__);
}
strcpy(pDes,argv[2]);
if?(?*(pDes+(len-1))?!=?'/'?)?{?//目錄缺少最后的'/',則補(bǔ)上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*?打開(kāi)目標(biāo)文件,?使權(quán)限與源文件相同*/?
fwd?=?open(pDes,O_WRONLY?|?O_CREAT?|?O_TRUNC,src_st.st_mode);
if?(fwd?==?-1)?{
my_err("Can?not?creat?file",?__LINE__);
}
copy_data(frd,fwd);
//puts("end?of?copy");
if?(len??0??pDes?!=?NULL)
free(pDes);
close(frd);
close(fwd);
return?0;
}
用C語(yǔ)言 寫unix 的 cp指令
你問(wèn)的不是很清楚。
cp命令的話
cp dir1 dir2肯定不行的嘛,拷貝目錄要加-R 或者-a參數(shù)的。
如果是自己寫程序?qū)崿F(xiàn)cp命令的話,用stat, 或者 lstat 或者 fstat函數(shù)。
具體查manpage.
網(wǎng)站名稱:c語(yǔ)言cp函數(shù) c語(yǔ)言和cpp
URL網(wǎng)址:http://www.dlmjj.cn/article/hpjcgd.html