用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\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;
}

2.运行结果

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

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

(2)被复制文件打不开

(3)成功复制

查看两个文件

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

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

结果

用WindowsAPI实现文件复制功能的更多相关文章

  1. 使用Java的多线程和IO流写一个文件复制功能类

    创建一个复制功能类,继承Thread类,重写run()方法,把FileInputStream和FileOutputStream输入输出流写在run()方法内.示例代码如下: import java.i ...

  2. windowsAPI遍历文件夹(速度高于递归)

    #region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...

  3. C#文件复制功能

    目的是将用户自定义文件复制到指定文件夹并且能查看该文件,下面是个人做的源码: sing System; using System.Collections.Generic; using System.C ...

  4. WindowsApi 解压缩文件

    .解压方法 转载自http://www.2cto.com/kf/201204/128704.html "C#解压.zip文件,网上一搜一大堆方法,有使用System.IO.Compressi ...

  5. java实现文件复制功能

    原理:把原文件读入到输入流里,然后利用输出流写入到新的文件. 代码如下: /** * 复制文件 * @param fromFile * @param toFile * <br/> * 20 ...

  6. 128 C语言实现文件复制功能(包括文本文件和二进制文件)

    文件的复制是常用的功能,要求写一段代码,让用户输入要复制的文件以及新建的文件,然后对文件进行复制.能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档. 实现 ...

  7. C语言实现文件复制功能(包括文本文件和二进制文件)

    文件的复制是常用的功能,要求写一段代码,让用户输入要复制的文件以及新建的文件,然后对文件进行复制.能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档. 实现 ...

  8. io流处理文件夹复制功能(java代码)

    拷贝某个目录下得所有文件拷指定位置 思想归纳 首先我们需要做的先获取到资源文件夹路径,这里我们先在程序中写死,然后我们还需要一个目标文件夹就是你需要拷贝到哪里.有了这两个文件夹我就可以进行复制了 然后 ...

  9. NIO与普通IO文件读写性能对比

    最近在熟悉java的nio功能.nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式.写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通 ...

随机推荐

  1. kubernetes系列(十) - 通过Ingress实现七层代理

    1. Ingress入门 1.1 Ingress简介 1.2 原理和组成部分 1.3 资料信息 2. Ingress部署的几种方式 2.1 前言 2.1 Deployment+LoadBalancer ...

  2. Qt-可视化数据库操作

    1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=89 说明:Qt可使用QSqlTableModel来进行数据库的可视化操作,将mode ...

  3. 数据库-SQL查询语言(一)

    SQL数据定义 DDL sql的DDL不仅能定义一组关系,还能定义每个关系的信息,包括: 每个关系的模式 每个属性的取值类型 完整性约束 每个关系的维护的索引集合 每个关系的安全性和权限信息 每个关系 ...

  4. 一些非常实用的git命令

    阅读目录 一.前言 二.git branch 和 git checkout 三.git clone 和 git remote 四.git pull 和 git push 五.git merge 和 g ...

  5. jmeter接口测试 -- 上传文件(multipart/form-data数据请求)

    一.环境 jmeter5.2.1 二.具体步骤 1.抓取接口的请求数据 2.填写jmeter的数据 1) 信息头管理器 2) 填写 “参数” 3) 填写 “文件上传” 三.检验接口. 1.响应数据 - ...

  6. 记一次抓包和破解App接口

    目录 第一章 · 起源 第二章 · 尝试 第三章 · 脱狱 第四章 · 柳暗花明 第五章 · 终结 第一章 · 起源 某日,想做个爬虫工具,爬某个网站上的数据已做实验之用.大家都知道爬pc网页上的数据 ...

  7. ES数据库重建索引——Reindex(数据迁移)

    应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的数据 ...

  8. IO—》Properties类&序列化流与反序列化流

    Properties类 介绍:Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. Properties类特点: ...

  9. Git 提交、删除、切换命令

    1.将本地代码提交到远程仓库 [初始将文件修改上传到远程仓库] 初始化: git init 添加到暂存区: git  add . 提交到仓库: git commit -m 'first commit' ...

  10. HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型

    本教程案例在线演示 有路网PC端 有路网移动端 教程配套源码资源 教程配套源码资源 div div 可定义文档中的分区(division). div 标签可以把网页分割为独立的.不同的部分. 可以看成 ...