实现Linux中cp的功能,linux系统IO练习-使用read、write实现cp功能

main函数传参

//argc:计算形参的个数

//char * argv[]:指针数组:里面存放了多个指针变量,每个指针可以指向一个字符串

int main(int argc, char * argv[])

{

if(argc != 3)

{

printf("指令有误,请重新输入!\n");

return -1;

}

printf("把%s拷贝到%s里面\n",argv[1],argv[2]);

return 0;

}

练习:

#include

#include

#include

#include

#include

#include

#include

#include

#define DATA_LEN 20 //拟定值

#define PATH_LEN 50

typedef struct file_inf

{

int file_a_fd;//文件描述符

int file_b_fd;

int cp_data_size;

int data_len;//数据长度 --- 每次读取的数据的字节数

char *file_a_path;//存放文件对应的路径

char *file_b_path;

}FI,*P_FI;

/*函数申明*/

P_FI Copy_Init(int file_num,char * a_path,char * b_path);

int Copying(P_FI fi);

int Copy_Free(P_FI fi);

P_FI Copy_Init(int file_num,char * a_path,char * b_path)

{

if((file_num != 2) || (access(a_path,F_OK)))

{

printf("指令有误!异常退出\n");

return (P_FI)-1;

}

/*申请空间*/

P_FI fi = (P_FI)malloc(sizeof(FI));

memset(fi,0,sizeof(FI));//这个清空,把里面的两个指针变量存放的数据清空成0

fi->file_a_path = (char *)malloc(PATH_LEN);

fi->file_b_path = (char *)malloc(PATH_LEN);

if(fi == NULL || fi->file_a_path == NULL || fi->file_b_path == NULL)

{

perror("malloc");

return (P_FI)-1;

}

/*先清空*/

memset(fi->file_a_path,0,PATH_LEN);

memset(fi->file_b_path,0,PATH_LEN);

//保存路径

strcpy(fi->file_a_path,a_path);

strcpy(fi->file_b_path,b_path);

umask(0000);

fi->file_a_fd = open(fi->file_a_path,O_RDONLY);

fi->file_b_fd = open(fi->file_b_path,O_WRONLY | O_CREAT,0777);

if(fi->file_a_fd == -1 || fi->file_b_fd == -1)

{

perror("open");

return (P_FI)-1;

}

fi->data_len = DATA_LEN;

fi->cp_data_size = 0;

return fi;//结构体指针

}

int Copying(P_FI fi)

{

char TQ[DATA_LEN];

int read_ret,write_ret;

while(1)

{

memset(TQ,0,DATA_LEN);

read_ret = read(fi->file_a_fd,TQ,DATA_LEN);

if(read_ret == -1)

{

perror("read");

return -1;

}

else if(read_ret == 0)

{

break;

}

else

{

write_ret = write(fi->file_b_fd,TQ,read_ret);

if(write_ret == -1)

{

perror("write");

return -1;

}

else

{

fi->cp_data_size+=read_ret;

}

}

}

return 0;

}

int Copy_Free(P_FI fi)

{

int close_ret_1 = close(fi->file_a_fd);

int close_ret_2 = close(fi->file_b_fd);

if(close_ret_1 == -1 || close_ret_2 == -1)

{

perror("close");

return -1;

}

free(fi->file_a_path);

free(fi->file_b_path);

free(fi);

return 0;

}

int main(int argc,char ** argv)

{

P_FI fi = Copy_Init(argc-1,argv[1],argv[2]);

if(fi == (P_FI)-1)

{

printf("初始化失败!\n");

}

else

{

printf("初始化成功!\n");

printf("即将把%s的数据拷贝到%s里面\n",fi->file_a_path,fi->file_b_path);

}

int copying_ret = Copying(fi);

if(copying_ret == -1)

{

printf("拷贝失败!\n");

return -1;

}

else

{

printf("拷贝完成,共拷贝%d个字节!\n",fi->cp_data_size);

}

int copy_free_ret = Copy_Free(fi);

if(copy_free_ret == -1)

{

printf("释放拷贝资源失败!\n");

return -1;

}

else

{

printf("释放拷贝资源成功!\n");

}

return 0;

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值