cp命令实现(linux下c语言),linux中cp命令如何用 C语言实现

满意答案

00e27ab806e4881f8254fe7ae8741834.png

lawliet6725

推荐于 2016.10.14

1,首先需要了解cp的原理。

2,可以参考cp的源码去了解其原理

3,cp命令的源码可以在linux内核中找到。

4,或者下载busybox其中也会有cp的源码

只有了解其原理之后才能谈如何实现。参考代码如下:#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#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) { //把读取部分写入目标文件

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; //分别指向源文件路径和目标文件路径

struct stat src_st,des_st;

if (argc 

printf("用法 ./MyCp  \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("略过目录",__LINE__);

}

pDes = argv[2];

stat(argv[2],&des_st);

if (S_ISDIR(des_st.st_mode)) { //目标路径是目录,则使用源文件的文件名

len = strlen(argv[1]);

pSrc = argv[1] + (len-1); //指向最后一个字符

/*先找出源文件的文件名*/

while (pSrc >= argv[1] && *pSrc != '/') {

pSrc--;

}

pSrc++;//指向源文件名

len = strlen(argv[2]);

// . 表示复制到当前工作目录

if (1 == len && '.' == *(argv[2])) {

len = 0; //没有申请空间,后面就不用释放

pDes = pSrc;

}

else { //复制到某目录下,使用源文件名

pDes = (char *)malloc(sizeof(char)*PATH_LEN);

if (NULL == pDes) {

my_err("malloc error ", __LINE__);

}

strcpy(pDes,argv[2]);

if ( *(pDes+(len-1)) != '/' ) { //目录缺少最后的'/',则补上’/‘

strcat(pDes,"/");

}

strcat(pDes+len,pSrc);

}

}

/* 打开目标文件, 使权限与源文件相同*/

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;

}

00分享举报

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值