linux cp命令的实现,linux cp命令简单的实现

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。那么你知道linux cp命令简单的实现么?接下来是小编为大家收集的linux cp命令简单的实现,欢迎大家阅读:

0d681dd2ed77e3a61102e27fd6b0abed.png

linux cp命令简单的实现

实现功能:

$./cp ~/filename ~/OtherName //文件到文件的拷贝

$./cp ~/directory/filename . //文件到当前目录的拷贝

$./cp ~/directory/filename ~/directory/ //文件到目录的拷贝

不白费口舌,直接上代码才是王道!

001

#include

002

#include

003

#include

004

#include

005

#include

006

#include

007

#include

008

#include

009

010

#define BUF_SIZE 1024

011

#define PATH_LEN 128

012

013

void my_err(char *err_string, int line )

014

{

015

fprintf(stderr,"line:%d ",line);

016

perror(err_string);

017

exit(1);

018

}

019

020

void copy_data(const int frd,const int fwd)

021

{

022

int read_len = 0, write_len = 0;

023

unsigned char buf[BUF_SIZE], *p_buf;

024

025

while ( (read_len = read(frd,buf,BUF_SIZE)) ) {

026

027

if (-1 == read_len) {

028

my_err("Read error", __LINE__);

029

}

030

else if (read_len > 0) { //把读取部分写入目标文件

031

p_buf = buf;

032

while ( (write_len = write(fwd,p_buf,read_len)) ) {

033

if(write_len == read_len) {

034

break;

035

}

036

else if (write_len > 0) { //只写入部分

037

p_buf += write_len;

038

read_len -= write_len;

039

}

040

else if(-1 == write_len) {

041

my_err("Write error", __LINE__);

042

}

043

}

044

if (-1 == write_len) break;

045

}

046

}

047

}

048

049

int main(int argc, char **argv)

050

{

051

052

int frd, fwd; //读写文件描述符

053

int len = 0;

054

char *pSrc, *pDes; //分别指向源文件路径和目标文件路径

055

struct stat src_st,des_st;

056

057

if (argc < 3) {

058

printf("用法 ./MyCp \n");

059

my_err("arguments error ", __LINE__);

060

}

061

062

frd = open(argv[1],O_RDONLY);

063

if (frd == -1) {

064

my_err("Can not opne file", __LINE__);

065

}

066

067

if (fstat(frd,&src_st) == -1) {

068

my_err("stat error",__LINE__);

069

}

070

/*检查源文件路径是否是目录*/

071

if (S_ISDIR(src_st.st_mode)) {

072

my_err("略过目录",__LINE__);

073

}

074

075

pDes = argv[2];

076

stat(argv[2],&des_st);

077

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

078

079

len = strlen(argv[1]);

080

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

081

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

082

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

083

pSrc--;

084

}

085

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

086

087

len = strlen(argv[2]);

088

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

089

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

090

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

091

pDes = pSrc;

092

}

093

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

094

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

095

if (NULL == pDes) {

096

my_err("malloc error ", __LINE__);

097

}

098

099

strcpy(pDes,argv[2]);

100

101

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

102

strcat(pDes,"/");

103

}

104

strcat(pDes+len,pSrc);

105

}

106

}

107

108

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

109

fwd = open(pDes,O_WRONLY | O_CREAT | O_TRUNC,src_st.st_mode);

110

if (fwd == -1) {

111

my_err("Can not creat file", __LINE__);

112

}

113

copy_data(frd,fwd);

114

//puts("end of copy");

115

if (len > 0 && pDes != NULL)

116

free(pDes);

117

118

close(frd);

119

close(fwd);

120

121

return 0;

122

}

看了“linux cp命令简单的实现”还想看:、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值