#include "sumu.h"
void my_cp(char *src, char *dest);
void my_cat(char *src);
void my_diff(char *src1, char *src2);
int main(int argc, char *argv[])
{
if(strncmp(argv[1], "cp", 2) == 0)
{// ./a.out cp 1.txt 2.txt
if(argc!= 4)
{
printf("cp命令格式错误\n");
return 0;
}
printf("this is cp command\n");
my_cp(argv[2], *(argv+3));
}
else if(strncmp(argv[1], "cat", 3) == 0)
{// ./a.out cat 1.txt 2.txt
int count = argc - 2;
if(count == 0)
{
printf("cat命令格式错误\n");
return 0;
}
printf("this is cat command\n");
for(int i=2; i<argc; i++)
{
my_cat(argv[i]);
}
}
else if(strncmp(argv[1], "diff", 4) == 0)
{// ./a.out diff 1.txt 2.txt
if(argc!= 4)
{
printf("diff命令格式错误\n");
return 0;
}
printf("this is diff command\n");
my_diff(argv[2], argv[3]);
}
else
{
printf("命令格式错误\n");
}
return 0;
}
void my_cp(char *src, char *dest)
{
//cp 1.txt 2.txt
int fd1=open(src, O_RDONLY);//只读
if (fd1<0)
{
printf("打开文件%s失败,%s\n", dest, strerror(errno));
return;
}
int fd2=open(dest, O_WRONLY|O_CREAT, 0666);//
if (fd1<0)
{
printf("打开文件%s失败,%s\n", dest, strerror(errno));
return;
}
char buf[10];
while(1)
{
memset(buf, 0, sizeof(buf));
ssize_t len = read(fd1, buf, sizeof(buf));
if(0>=len)
{
break;
}
write(fd2, buf, len);
}
close(fd1);
close(fd2);
}
void my_cat(char *src)
{
//cat 1.txt 2.txt
int fd1=open(src, O_RDONLY);//只读
if (fd1<0)
{
printf("打开文件%s失败,%s\n", src, strerror(errno));
return;
}
char buf[10];
while(1)
{
memset(buf, 0, sizeof(buf));
ssize_t len = read(fd1, buf, sizeof(buf));
if(0>=len)
{
break;
}
printf("%s", buf);
}
putchar('\n');
close(fd1);
}
void my_diff(char *src1, char *src2)
{
int fd1 = open(src1, O_RDONLY); // 只读
if (fd1 < 0)
{
printf("打开文件%s失败, %s\n", src1, strerror(errno));
return;
}
int fd2 = open(src2, O_RDONLY); // 只读
if (fd2 < 0)
{
printf("打开文件%s失败, %s\n", src2, strerror(errno));
close(fd1); // 关闭已打开的文件描述符
return;
}
char buf1[1024] = {0};
char buf2[1024] = {0};
ssize_t len1, len2;
off_t offset1 = 0, offset2 = 0; // 光标位置
offset1 = lseek(fd1, 0, SEEK_END);
offset2 = lseek(fd2, 0, SEEK_END);
if (offset1 != offset2)
{
printf("文件%s和文件%s大小不同\n", src1, src2);
close(fd1);
close(fd2);
return;
}
else
{
lseek(fd1, 0, SEEK_SET);
lseek(fd2, 0, SEEK_SET);
}
while (1)
{
len1 = read(fd1, buf1, sizeof(buf1));
len2 = read(fd2, buf2, sizeof(buf2));
if (len1 <= 0 && len2 <= 0)
{
break;
}
if (len1 != len2 || memcmp(buf1, buf2, len1) != 0)
{
printf("文件%s和文件%s不相同内容\n", src1, src2);
printf("文件%s内容:\n%s\n", src1, buf1);
putchar(10);
printf("文件%s内容:\n%s\n", src2, buf2);
printf("-------------------------------------------\n");
}
}
close(fd1);
close(fd2);
}
文件io day_01
于 2024-08-08 17:52:29 首次发布