实现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;

}

Linux,可以使用文件IO的方式来实现cp命令的复制功能。具体步骤如下: 1. 打开源文件和目标文件,可以使用open()函数,如下所示: ``` int src_fd = open("source_file", O_RDONLY); int dest_fd = open("destination_file", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); ``` 其,第一个参数为文件名,第二个参数为打开文件的模式,第三个参数为文件权限。 2. 读取源文件的内容并写入目标文件,可以使用read()和write()函数,如下所示: ``` char buffer[1024]; int read_size = 0; while((read_size = read(src_fd, buffer, sizeof(buffer))) > 0) { write(dest_fd, buffer, read_size); } ``` 其,第一个参数为文件描述符,第二个参数为读取或写入的缓冲区,第三个参数为缓冲区的大小。 3. 关闭源文件和目标文件,可以使用close()函数,如下所示: ``` close(src_fd); close(dest_fd); ``` 完整代码如下所示: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> int main(int argc, char *argv[]) { if(argc != 3) { printf("Usage: %s <source_file> <destination_file>\n", argv[0]); return 1; } int src_fd = open(argv[1], O_RDONLY); if(src_fd < 0) { printf("Failed to open source file: %s\n", argv[1]); return 1; } int dest_fd = open(argv[2], O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); if(dest_fd < 0) { printf("Failed to open destination file: %s\n", argv[2]); close(src_fd); return 1; } char buffer[1024]; int read_size = 0; while((read_size = read(src_fd, buffer, sizeof(buffer))) > 0) { write(dest_fd, buffer, read_size); } close(src_fd); close(dest_fd); return 0; } ``` 将上面的代码保存为cp.c文件,然后使用gcc编译即可生成可执行文件cp: ``` gcc cp.c -o cp ``` 使用方法: ``` ./cp source_file destination_file ``` 其,source_file为源文件名,destination_file为目标文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值