11.1 文件拷贝移动与删除
在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格式化,输出分区表数据,监控目录变化等。
11.1 ReadFile
ReadFile是一个文件读取函数,该函数可以将一个文件读入到特定的缓冲区内,在读取之前读者需要自行调用CreateFileA函数打开一个文件,首先来看一下打开文件的函数原型;
HANDLE CreateFileA(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile
);
函数创建或打开一个文件或输入输出(I/O)设备的函数。函数返回一个类型为 HANDLE 的文件句柄,该句柄可用于后续对文件的读写操作。如果文件创建成功,返回值是文件的句柄;如果函数失败,则返回值是 INVALID_HANDLE_VALUE(-1)。
参数说明:
- lpFileName:要打开的文件名或设备名,该参数可以是完整路径名、相对路径名或文件名和相对路径名的组合。
- dwDesiredAccess:要求对文件进行的访问类型,如 GENERIC_READ 或 GENERIC_WRITE,也可以同时指定。
- dwShareMode:其他进程访问该文件时的共享模式,如 FILE_SHARE_READ 或 FILE_SHARE_WRITE。
- lpSecurityAttributes:一个指向 SECURITY_ATTRIBUTES 结构的指针,指定文件的安全属性。该参数可以为空,表示文件没有安全属性。
- dwCreationDisposition:如何创建新的文件,如 CREATE_NEW 或 OPEN_ALWAYS。
- dwFlagsAndAttributes:文件的属性和标志,如 FILE_ATTRIBUTE_NORMAL 或 FILE_FLAG_BACKUP_SEMANTICS。
- hTemplateFile:文件句柄,该文件句柄必须是 GENERIC_READ 访问类型的文件。
接着是ReadFile函数的原型定义;
BOOL ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped
);
参数说明:
-
hFile: 要读取的文件句柄
-
lpBuffer: 指向用于存储读取数据的缓冲区的指针
-
nNumberOfBytesToRead: 要读取的字节数
-
lpNumberOfBytesRead: 返回实际读取的字节数的指针
-
lpOverlapped: 指定了异步读取的选项。如果想要同步读取,该参数可以为NULL。
该函数如果函数成功读取,则返回非零值,lpNumberOfBytesRead指向的变量将被设置为实际读取的字节数,如果函数失败,则返回零。要获取扩展错误信息,可调用GetLastError()函数。
#include <iostream>
#include <Windows.h>int main(int argc, char* argv[])
{HANDLE hFile;DWORD fileSize, readSize;char* buffer;hFile = CreateFile("d:\\lyshark.exe", // 文件名GENERIC_READ, // 读取权限0, // 阻止其他进程访问NULL, // 子进程不可继承本句柄OPEN_EXISTING, // 仅当该文件或设备存在时,打开它FILE_ATTRIBUTE_NORMAL, // 普通文件NULL); // 不适用模板文件if (hFile == INVALID_HANDLE_VALUE){return 0;}fileSize = GetFileSize(hFile, NULL); // 获取文件大小buffer = (char*)malloc(fileSize + 1); // 获取一块内存buffer[fileSize] = '\0'; // 设置结尾ReadFile(hFile, // 文件句柄buffer, // 读取到的文件所存放的缓冲区fileSize, // 要读取的字节数&readSize, // 实际读取的字节数NULL // 用 FILE_FLAG_OVERLAPPED 打开时所需的);printf(buffer);CloseHandle(hFile);free(buffer);system("pause");return 0;
}
11.2 CopyFile
CopyFile 函数,用于将一个文件从一个位置复制到另一个位置,该函数原型为:
BOOL CopyFile(LPCWSTR lpExistingFileName,LPCWSTR lpNewFileName,BOOL bFailIfExists
);
其中,lpExistingFileName 表示要复制的文件名,lpNewFileName 表示复制后的新文件名,bFailIfExists 表示如果新文件名已经存在是否覆盖。如果成功复制文件,则返回非零值。如果失败,则返回零。
#include <iostream>
#include <Windows.h>// 判断是否为目录
BOOL isDirectory(char* path)
{WIN32_FIND_DATA fd;BOOL rel = FALSE;char* p = path;// 查找到第一个文件的句柄HANDLE hFind = FindFirstFile(path, &fd);while (*p != '\0') p++;// 如果结尾是这两种符号就肯定是目录if (*(--p) == '\\' || *(p) == ' / '){*p = '\0';return TRUE;}// 判断是否获取错误if (hFind != INVALID_HANDLE_VALUE){// 文件信息按位与上目录属性, 非目录则全部置零if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){rel = TRUE;}// 关闭查找句柄FindClose(hFind);}return rel;
}int main(int argc, char* argv[])
{char file_src[MAX_PATH] = { 0 };char file_dest[MAX_PATH] = { 0 };strcpy(file_src, "d://lyshark.exe");strcpy(file_dest, "d://");if (isDirectory(file_dest)){// 如果第二个参数是目录,则拼装新的文件路径sprintf(file_dest, "%s\\%s", file_dest, file_src);}if (CopyFile(file_src, file_dest, 0) == 0){printf("文件复制失败 \n");}else{printf("文件已复制 \n");}system("pause");return 0;
}
11.3 MoveFile
MoveFile 函数,用于将文件从一个位置移动到另一个位置,该函数可以用于重命名文件或将文件从一个目录移动到另一个目录。如果要在同一目录中重命名文件,可以将文件的新名称作为 lpNewFileName 参数提供,而 lpExistingFileName 参数应保持不变。如果要移动文件到另一个目录,可以提供新目录的路径和名称作为 lpNewFileName参数,该函数原型如下所示;
BOOL MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName
);
其中,lpExistingFileName 是要移动的文件的完整路径和名称,lpNewFileName 是文件的新路径和名称。如果文件成功移动,则函数返回非零值,否则返回零,读者需要注意,该函数只能移动文件,无法移动文件夹。如果要移动文件夹,可以使用 MoveFileEx() 函数。
#include <iostream>
#include <Windows.h>// 判断是否为目录
BOOL isDirectory(char* path)
{WIN32_FIND_DATA fd;BOOL rel = FALSE;char* p = path;// 查找到第一个文件的句柄HANDLE hFind = FindFirstFile(path, &fd);while (*p != '\0') p++;// 如果结尾是这两种符号就肯定是目录if (*(--p) == '\\' || *(p) == ' / '){*p = '\0';return TRUE;}// 判断是否获取错误if (hFind != INVALID_HANDLE_VALUE){// 文件信息按位与上目录属性, 非目录则全部置零if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){rel = TRUE;}// 关闭查找句柄FindClose(hFind);}return rel;
}int main(int argc, char* argv[])
{char file_src[MAX_PATH] = { 0 };char file_dest[MAX_PATH] = { 0 };strcpy(file_src, "d://lyshark.exe");strcpy(file_dest, "d://lyshark");if (isDirectory(file_dest)){// 如果第二个参数是目录, 则拼装新的文件路径sprintf(file_dest, "%s\%s", file_dest, file_src);}if (MoveFile(file_src, file_dest) == 0){printf("文件剪切失败 \n");}else{printf("文件剪切成功 \n");}system("pause");return 0;
}
11.4 DelteFile
DeleteFile 函数用于删除指定的文件,该函数位于windows.h头文件中,此函数只能用于删除文件而无法删除目录,如果需要删除目录则需要使用RemoveDirectory来实现,该函数原型如下:
BOOL DeleteFile(
LPCTSTR lpFileName
);
其中,lpFileName 参数是一个指向以 NULL 结尾的字符串,表示要删除的文件名,可以是绝对路径或相对路径,函数执行成功时返回 TRUE,否则返回 FALSE,如果删除失败则可以调用GetLastError()得到失败代码。
#include <iostream>
#include <Windows.h>int main(int argc, const char* argv[])
{// 如果非零则删除失败if (!DeleteFile("d://lyshark.exe")){printf("删除文件错误:%x \n", GetLastError());}system("pause");return 0;
}
相关文章:
11.1 文件拷贝移动与删除
在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格…...
redhat下使用CentOS yum源,并安装docker
一、安装yum源 1.卸载yum # 查看系统自身安装的yum软件包 rpm -qa | grep yum # 卸载软yum件包 rpm -e 软件包名称 --nodeps #可以使用简称如 rpm -e yum-* --nodeps2. 安装yum [rootbogon ~]# rpm -ivh --nodeps https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Pa…...
基于单片机体温脉搏检测控制系统及源程序
一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…...
MyBatis-Plus逻辑删@TableLogic
MyBatis-Plus逻辑删除指,在数据库中删除数据时,并没有真正的删除,而是更改指定字段的值,这个字段的值可以为0或1,0代表未删除,1代表已删除,所以delete操作实际上是update操作,查询操作也是要加w…...
本地私域线上线下 线上和线下的小程序
私域商城是一种新型的零售模式,它将传统的线下实体店与线上渠道相结合,通过会员、营销、效率等方式,为消费者提供更加便利和高效的购物体验。私域商城的发展趋势表明,它将成为未来零售业的重要模式,引领零售业的创新和…...
【前端学java】java中的Object类(8)
往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…...
TensorFlow实战教程(二十六)-什么是生成对抗网络GAN?基础原理和代码普及
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了Keras实现经典的深度学习文本分类算法,包括LSTM、BiLSTM、BiLSTM+Attention和CNN、TextCNN。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、…...
IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven依赖管理,版本号管理,继承和聚合
第一章 Maven的依赖管理 1.1 依赖范围 依赖语法:<scope> compile【默认值】:在main、test、Tomcat【服务器】下均有效。test:只能在test目录下有效 junit provided:在main、test下均有效,Tomcat【服务器】无效…...
OpenVPN Connect使用连接公网VPN服务器实现内网穿透
安装并运行OpenVPN Connect 点击AGREE 添加配置.OVPN文件 点击连接 连接成功 两个内网主机通过公网VPN穿透...
Redis(集合Set和有序集合SortedSet)
SET集合中的元素是不允许重复的,SET中的命令都是以S开头的。 使用SADD 在集合中添加元素,使用SMEMBERS查看元素。 当添加重复元素时,会返回0代表添加失败,查询还是就Redis一个元素。 使用SISMEMBER查询元素是否在集合中ÿ…...
黔院长 | 《黄帝内经》——奇病论!
世界之大,无奇不有,就连病症也是如此,近年更是新增各类奇形怪状的疾病,今天就带大家一同走进《黄帝内经》的奇病篇,一起了解部分罕见的疾病及其特征! “奇病论”当中提到,有些妇女怀孕到第九个月…...
手撕单链表(C语言)
目录 1.单链表的物理结构 2.头文件的实现 3.SList.c文件的实现 3.1尾插、创建节点 3.2打印 3.3头插 3.4尾删 3.5头删 3.6查找 3.7指定位置之前插入数据 3.8指定位置之后插入数据 3.9删除指定位置节点 3.10删除pos之后的节点 3.11销毁链表 4 所有的代码 1.单链表的物理结构 众所…...
60 权限提升-MYMSORA等SQL数据库提权
目录 数据库应用提权在权限提升中的意义WEB或本地环境如何探针数据库应用数据库提权权限用户密码收集等方法目前数据库提权对应的技术及方法等 演示案例Mysql数据库提权演示-脚本&MSF1.UDF提权知识点: (基于MYSQL调用命令执行函数)读取数据库存储或备份文件 (了…...
【C++上层应用】2. 预处理器
文章目录 【 1. #define 预处理 】【 2. #ifdef、#if 条件编译 】2.1 #ifdef2.2 #if2.3 实例 【 3. # 和 ## 预处理 】3.1 # 替换预处理3.2 ## 连接预处理 【 4. 预定义宏 】 预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是…...
ISP--Black Level Correction(黑电平矫正)
图像的每一个像素点都是由一个光电二极管控制的,由二极管将电信号,转换为数字信号。 那么,我们知道了,图像的像素值是与电信号强度相关的。但是,我们得知道,每一个光电二极管要想工作,都得有一定…...
python项目源码基于django的宿舍管理系统dormitory+mysql数据库文件
基于Django的宿舍管理系统 运行效果 个人亲自制作python项目源码基于django的宿舍管理系统dormitorymysql数据库文件 1. 介绍 宿舍管理系统是一个基于Django框架开发的项目,旨在简化和优化宿舍管理的流程。该系统包括学生和管理员两个角色,学生可以通过…...
Java和 JS 的10大不同之处,你清楚吗?
还记得刚开始学习编程时,我就在想:“Java和JavaScript是同一种语言吗?”。就是因为看到它们名称中都带“java”,所以才会误以为它们有关系。实际上,它们并没有太大的联系。 这两者的关系,就和英语与斯瓦希…...
vue动态配置路由
文章目录 前言定义项目页面格式一、vite 配置动态路由新建 /router/utils.ts引入 /router/utils.ts 二、webpack 配置动态路由总结如有启发,可点赞收藏哟~ 前言 项目中动态配置路由可以减少路由配置时间,并可减少配置路由出现的一些奇奇怪怪的问题 路由…...
科技云报道:全球勒索攻击创历史新高,如何建立网络安全的防线?
科技云报道原创。 最简单的方式,往往是最有效的,勒索软件攻击就属于这类。 近两年,随着人类社会加速向数字世界进化,勒索软件攻击成为网络安全最为严重的威胁之一。今年以来,勒索软件攻击在全球范围内呈现快速上升态…...
通过bat命令启动jar后缀软件
要通过bat命令启动一个带有.jar后缀的软件,可以使用以下的bat文件命令: echo off java -jar "路径\文件名.jar" pause请将路径\文件名.jar替换为实际的文件路径和文件名。例如,如果你的文件位于C:\Program Files\MyApp\app.jar&am…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
