zoukankan      html  css  js  c++  java
  • 用WindowsAPI实现文件复制功能

    用WindowsAPI实现文件复制功能

    1. c代码

    注释也在里面

    文件名为 copyfile.c 运行出来的exe为 copyfile.exe

    #include <windows.h>
    #include <stdio.h>
    #define BUF_SIZE 256
    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
    ");
            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
    ",
                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
    ",
                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
    ", GetLastError ());
                return 4;
            }
        }
        //提示复制成功!
        printf ("文件复制时成功
    ");
        //关闭句柄 
        CloseHandle (handleIn);
        CloseHandle (handleOut);
        return 0;
    }
    

    2.运行结果

    我此时的文件存在情况 只有1.txt 和 2.txt

    image

    (1)参数多或者少则提示用法

    image

    (2)被复制文件打不开

    image

    (3)成功复制

    image

    查看两个文件

    image

    (4)目的地文件打开失败

    首先我要设置2.txt为只读 这样就会触发第二个错误

    image

    结果

    image

  • 相关阅读:
    99%的人没使用过它俩,Docker最佳实践+2
    kubernetes 中 kubeconfig 的用法
    jenkins批量修改配置文件
    记一次K8s排错实战
    记一次失败记录: MindSpore1.3.0 GPU 源码安装 —— Ubuntu18.04系统 (最终安装结果为失败)
    【转载】 使用Python的ctypes查看内存
    (摘抄) 源码分析multiprocessing的Value Array共享内存原理
    (续) python 中 ctypes 的使用尝试
    python 中 ctypes 的使用尝试
    深度强化学习算法(深度强化学习框架)为考虑可以快速适用多种深度学习框架建议采用弱耦合的软件设计方法——快速适用于多种深度学习计算框架的深度强化学习框架设计方案
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9589219.html
Copyright © 2011-2022 走看看