操作系统概念 第二章 2.15 利用Windows API 实现文件复制

本文详细解析了一个在Windows环境下利用C语言实现的文件复制程序。文章深入探讨了句柄(HANDLE)、LPTSTR、CHAR、DWORD等数据类型的使用,以及CreateFile、ReadFile、WriteFile等API函数的功能和应用。通过实例,读者可以了解到如何打开、读取、写入文件,以及如何处理文件复制过程中可能出现的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<windows.h>
#include<stdio.h>
#define BUF_SIZE 1000

int main(int argc,LPTSTR argv [])
{
    //LPTSTR类型 与char*等价,表示普通字符/字符串变量,指向字符/字符串的指针。

    HANDLE handleIn, handleOut;//句柄(HANDLE)是资源的标识,操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源
    //HANDLE 是一个32位的无符号整数,是一个对象的句柄,可以认为存放的是一个对象的地址
    //  printf("%d", handleIn);
    DWORD readsizeIn, readsizeOut;
    //#define DWORD unsigned long 所以比较方便移植用的 ,Windows下经常用来保存地址(或者存放指针) 

    CHAR Buffer [BUF_SIZE]; //大写的CHAR也表示 CHAR为单字节字符 Windows为了消除各编译器的差别,重新定义了一些数据类型

    //argc,argv 用命令行编译程序时有用
    //argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数
    //* argv[ ]: 指针数组,用来存放指向你的字符串参数的指针,每一个元素指向一个参数

    //如果传入的参数不等于3的话 说明用户没有输入正常的参数(参数多了或者少了)
    //此时提示用户正确的输入参数方法,并且退出程序
    if (argc != 3) {  
        printf ("正确使用方法: copyfile 文件名1 文件名2\n");
        return 1;
    }

    //如果通过上面判断语句的话说明参数输入符合形式 则进行下一个判断

    //(1)判断文件1是否能打开, 创建一个句柄来标识输入文件
    //CreateFile 这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。
    handleIn = CreateFile (argv [1], GENERIC_READ,
        FILE_SHARE_READ, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    //      printf("%ld", handleIn);    
    //如果文件打开失败 提示用户 并且调用GetLastError()函数取得上一个函数(也就是CreateFile函数)操作时所产生的错误代码
    if (handleIn == INVALID_HANDLE_VALUE) {
        printf ("不能打开被复制文件(文件1). 错误代码: %x\n",
            GetLastError ());
        return 2;
    }
    //同上 这次是判断是否能打开文件2, 解释如上
    handleOut = CreateFile (argv [2], GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (handleOut == INVALID_HANDLE_VALUE) {
        printf ("不能打开目标文件(文件2). 错误代码: %x\n",
            GetLastError ());
        return 3;
    }
    //下面进行文件复制的操作 调用ReadFile和WriteFile函数 每次读入字节数为BUF_SIZE
    //readsizeIn指向实际读取字节数的指针  而且ReadFile调用成功,返回非0,readsizeIn也要是大于0才表示可以继续读  

    while (ReadFile (handleIn, Buffer, BUF_SIZE, &readsizeIn, NULL) && readsizeIn > 0) {
        WriteFile (handleOut, Buffer, readsizeIn, &readsizeOut, NULL);
        if (readsizeIn != readsizeOut) {
            printf ("文件复制时出现错误。 错误代码: %x\n", GetLastError ());
            return 4;
        }
    }
    //提示复制成功!
    printf ("文件复制时成功\n");
    //关闭句柄 
    CloseHandle (handleIn);
    CloseHandle (handleOut);
    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值