linux中cp命令如何用 C语言实现

 我来答
AA5956
2015-08-11 · TA获得超过1869个赞
知道小有建树答主
回答量:705
采纳率:72%
帮助的人:471万
展开全部

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

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

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

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

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

#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) { //把读取部分写入目标文件
            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 < 3) {
        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;
}
匿名用户
2010-03-14
展开全部
用fopen()或者open()打开源文件和目标文件,用fread()或者read()函数读取源文件,用fwrite()或者write()写入目标文件,再用fclose()或者close()关闭文件.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友8a22a1696
2010-03-14 · TA获得超过187个赞
知道小有建树答主
回答量:405
采纳率:0%
帮助的人:256万
展开全部
system函数,直接可以用cp这个命令
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
己玛利39
2012-03-14 · 超过29用户采纳过TA的回答
知道答主
回答量:136
采纳率:0%
帮助的人:78.7万
展开全部
直接下载一下cp 指令的源码,看看不就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
crab2313
2012-03-13 · TA获得超过255个赞
知道小有建树答主
回答量:346
采纳率:0%
帮助的人:285万
展开全部
孩子去看coreutils的源码 , 里面有cp源码
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式