#include <stdio.h> // 包含标准输入输出库
#include <unistd.h> // 包含用于POSIX操作系统API的库
#include <string.h> // 包含用于字符串处理的库
#include <errno.h> // 包含用于错误处理的库
#include <sys/types.h> // 包含用于POSIX系统调用的类型定义
#include <sys/stat.h> // 包含文件状态相关的定义
#include <fcntl.h> // 包含文件操作相关的定义
char buff[1024]; // 定义一个大小为1024字节的缓冲区
// 以下是三种不同的文件复制函数实现,每个函数有不同的复制方法
// 方法一:使用标准I/O函数实现文件复制
int FileCopy(char *filesource, char *filedestination)
{
FILE *fp, *fp1;
char ch;
fp = fopen(filesource, "rb"); // 以只读二进制模式打开源文件
if (fp == NULL)
{
printf("file %s open error:%s \n", filesource, strerror(errno));
return -1; // 打开失败时返回错误码
}
fp1 = fopen(filedestination, "wb"); // 以只写二进制模式创建目标文件
if (fp1 == NULL)
{
printf("file %s open error:%s \n", filedestination, strerror(errno));
fclose(fp);
return -2; // 创建失败时返回错误码
}
ch = fgetc(fp); // 逐个字符读取源文件内容
while (!feof(fp))
{
fputc(ch, fp1); // 逐个字符写入目标文件
ch = fgetc(fp); // 继续读取下一个字符
}
fclose(fp);
fclose(fp1);
return 0; // 文件复制成功时返回0
}
// 方法二:使用标准I/O函数和缓冲区实现文件复制
int FileCopy1(char *filesource, char *filedestination)
{
FILE *fp, *fp1;
int len;
fp = fopen(filesource, "rb"); // 以只读二进制模式打开源文件
if (fp == NULL)
{
printf("file %s open error:%s \n", filesource, strerror(errno));
return -1; // 打开失败时返回错误码
}
fp1 = fopen(filedestination, "wb"); // 以只写二进制模式创建目标文件
if (fp1 == NULL)
{
printf("file %s open error:%s \n", filedestination, strerror(errno));
fclose(fp);
return -2; // 创建失败时返回错误码
}
len = fread(buff, 1, 1024, fp); // 从源文件读取1024字节到缓冲区
while (len > 0)
{
fwrite(buff, 1, len, fp1); // 将缓冲区内容写入目标文件
len = fread(buff, 1, 1024, fp); // 继续从源文件读取数据到缓冲区
}
fclose(fp);
fclose(fp1);
return 0; // 文件复制成功时返回0
}
// 方法三:使用文件描述符和系统调用实现文件复制
int FileCopy2(char *filesource, char *filedestination)
{
int fd, fd1;
int len, n;
fd = open(filesource, O_RDONLY); // 使用文件描述符打开源文件(只读模式)
if (fd == 0)
{
printf("file %s open error:%s \n", filesource, strerror(errno));
return -1; // 打开失败时返回错误码
}
fd1 = open(filedestination, O_WRONLY | O_CREAT); // 使用文件描述符创建目标文件
if (fd1 <= 0)
{
printf("file %s open error:%s \n", filedestination, strerror(errno));
close(fd);
return -2; // 创建失败时返回错误码
}
printf("copy start...\n");
len = read(fd, buff, 128); // 从源文件读取128字节到缓冲区
n = 0;
while (len > 0)
{
write(fd1, buff, len); // 将缓冲区内容写入目标文件
len = read(fd, buff, 128); // 继续从源文件读取数据到缓冲区
n++;
if ((n % 10240) == 0)
printf("a\n");
}
printf("\n");
close(fd);
close(fd1);
return 0; // 文件复制成功时返回0
}
int main(int argc, char *argv[])
{
if (argc != 3)
{
printf("Usage: mycopy source destination\n");
return 0;
}
// 调用文件复制函数,传入命令行参数中的源文件和目标文件名
// 可以选择注释掉两个函数中的两个以测试不同的复制方法
// FileCopy(argv[1], argv[2]);
// FileCopy1(argv[1], argv[2]);
FileCopy2(argv[1], argv[2]);
printf("\n");
return 0;
}
我的文件复制代码(三种类型)
最新推荐文章于 2024-07-24 18:23:35 发布