我的文件复制代码(三种类型)

#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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值