作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

场景需求

在日常工作中,必然会和各类文件打交道,如何高效地操作处理文件是提高工作效率的关键。Excel、VB、Python等等用好了,都可以将傻瓜操作(批量复制粘贴、筛选查找等)自动化,仅需秒级时间,即可完成他人小时级时间的工作量,剩下的时间至于是摸鱼还是自主学习,就看个人了。由此可见,高效的工作方法选对了是多么重要。

本文所要实现的需求:有一文件夹A,大概有千级往上数量的录音文件,每个录音文件名格式为“手机号码+乱码.xxx”;手头另有一号码表格B,存放了200个左右的11位手机号码。要求将文件夹A中号码与表格B号码匹配的录音,拷贝到另一文件夹C中。

如果用EXCEL,可以借助VLOOKUP,完成筛选,再用Bat的copy指令,完成拷贝操作。(方法多种多样,有其他思路的欢迎评论区留言,一同交流学习)

那如何用C++实现,本文将进行详细的讲解,提供源码和简易测试代码。(实现方法同样多种多样,本文仅用了一种方案,仅供参考)

解决思路

要想完成该功能,可以拆分一下各个子功能。

  • 第一步要做的是将文件夹A中后缀为xxx的文件先提取出来。
  • 第二步是将表格B中的号码提取出来。
  • 第三步是匹配,也是关键步骤。将A中与B匹配的录音筛选出来,只有满足要求才能拷贝,其他的直接跳过。该步骤也是大家可以自定义匹配规则的一步,根据自己需求设计。

具体实现

1)我们将文件夹A的路径用字符串from存储下来,文件夹C的路径用字符串to存储下来,同时定义一个表格B的路径。

string from = "C:\\Users\\Administrator\\Desktop\\current\\";
string to = "C:\\Users\\Administrator\\Desktop\\target\\";
string sheetpath= "C:\\Users\\Administrator\\Desktop\\current\\test.txt";

2)设计一个getFiles函数,用于获取目标文件夹下目标文件信息,并存放在vector中。

// 获取目标文件夹下目标文件信息
void getFiles(std::string path, vector<std::string>& files, vector<std::string>& filesname, std::string suffix)
{intptr_t  hFile = 0;struct _finddata_t fileinfo;string p;// 寻找当前文件夹下后缀为mp3的文件if ((hFile = _findfirst(p.assign(path).append(suffix).c_str(), &fileinfo)) != -1) {do {// files存放文件全路径files.push_back(p.assign(path).append(fileinfo.name));// filesname存放文件名filesname.push_back(fileinfo.name);} while (_findnext(hFile, &fileinfo) == 0);         // _findnext若匹配成功返回0,不成功返回-1_findclose(hFile);}
}

3)设计一个getNumber函数,用于获取表格B中的号码信息,用于后期匹配。

// 获取数字表
vector<string> getNumber(string sheetpath)
{vector<string> numbers;ifstream infile(sheetpath);string str;// 一行行读取while (getline(infile, str)){string temp = str.substr(0, 11);numbers.push_back(temp.c_str());}// 关闭infile.close();return numbers;
}

4)设计一个copyFile函数,用于将文件M拷贝到另一路径中。

// 复制文件
void copyFile(char* tfrom, char* tto)
{// 打开FILE* fpread = fopen(tfrom, "rb");  // 读       FILE* fpwrite = fopen(tto, "wb");   // 写if (fpread == NULL) {cout << "error: read error." << endl;return;}if (fpwrite == NULL) {cout << "error: write error." << endl;return;}// 读写操作char* p;p = (char*)malloc(sizeof(char));    // 为指针申请内存空间 while (!feof(fpread)) {           // feof()检测光标后是否还有内容 没有则返回非0 fread(p, sizeof(char), 1, fpread);fwrite(p, sizeof(char), 1, fpwrite);}if (p != NULL) {free(p);p = NULL;}// 关闭fclose(fpread);fclose(fpwrite);return;
}

5)设计一个isMatch函数,用于匹配。如果你有自己其他的匹配需求,可以更改该函数。我这里只进行了一个去空格和寻找的操作。

// 匹配字符串
bool isMatch(string filename, vector<string> sheet)
{// 去除空格int i = int(filename.find(" ", 0));while (i != string::npos){filename.replace(i, 1, "");i = int(filename.find(" ", 0));}// 取前11位号码string number = filename.substr(0, 11);// 寻找是否在库中vector<string>::iterator it = find(sheet.begin(), sheet.end(), number);if (it == sheet.end())return false;elsereturn true;
}

6)用identifyFiles函数将上述功能简单封装一下。若输出文件夹不存在,创建一个;获取符合要求的文件的信息;获取表格B的号码;循环匹配,匹配成功,执行拷贝。

// 识别文件
void identifyFiles(std::string from, std::string to, std::string sheetpath, std::string suffix)
{vector<std::string> files;vector<std::string> filesname;// 如果文件夹不存在,则创建if (_access(to.c_str(), 0) == -1)int re = _mkdir(to.c_str());// 获取符合要求文件的信息getFiles(from, files, filesname, suffix);// 获取数字表vector<string> numbers = getNumber(sheetpath);// 识别int size = int(files.size());char* tf = new char[256];char* tn = new char[256];std::string target;for (int i = 0; i < size; i++) {// 若匹配成功则拷贝,失败则跳过if (isMatch(filesname[i], numbers)){target = to + filesname[i];strcpy(tf, files[i].c_str());strcpy(tn, target.c_str());copyFile(tf, tn);}}// 释放指针if (tn != NULL) {free(tn);tn = NULL;}if (tf != NULL) {free(tf);tf = NULL;}return;
}

7)以上就是该功能实现的整个思路。

C++完整代码及测试案例

#include <iostream>
#include <stdlib.h>
#include <io.h>
#include <vector>
#include <stdio.h>
#include <string>
#include <cstring>
#include <vector>
#include <sstream>
#include <fstream>
#include <direct.h>
#pragma warning(disable:4996)
using namespace std;// 匹配字符串
bool isMatch(string filename, vector<string> sheet)
{// 去除空格int i = int(filename.find(" ", 0));while (i != string::npos){filename.replace(i, 1, "");i = int(filename.find(" ", 0));}// 取前11位号码string number = filename.substr(0, 11);// 寻找是否在库中vector<string>::iterator it = find(sheet.begin(), sheet.end(), number);if (it == sheet.end())return false;elsereturn true;
}// 复制文件
void copyFile(char* tfrom, char* tto)
{// 打开FILE* fpread = fopen(tfrom, "rb");  // 读       FILE* fpwrite = fopen(tto, "wb");   // 写if (fpread == NULL) {cout << "error: read error." << endl;return;}if (fpwrite == NULL) {cout << "error: write error." << endl;return;}// 读写操作char* p;p = (char*)malloc(sizeof(char));    // 为指针申请内存空间 while (!feof(fpread)) {           // feof()检测光标后是否还有内容 没有则返回非0 fread(p, sizeof(char), 1, fpread);fwrite(p, sizeof(char), 1, fpwrite);}if (p != NULL) {free(p);p = NULL;}// 关闭fclose(fpread);fclose(fpwrite);return;
}// 获取目标文件夹下目标文件信息
void getFiles(std::string path, vector<std::string>& files, vector<std::string>& filesname, std::string suffix)
{intptr_t  hFile = 0;struct _finddata_t fileinfo;string p;// 寻找当前文件夹下后缀为mp3的文件if ((hFile = _findfirst(p.assign(path).append(suffix).c_str(), &fileinfo)) != -1) {do {// files存放文件全路径files.push_back(p.assign(path).append(fileinfo.name));// filesname存放文件名filesname.push_back(fileinfo.name);} while (_findnext(hFile, &fileinfo) == 0);         // _findnext若匹配成功返回0,不成功返回-1_findclose(hFile);}
}// 获取数字表
vector<string> getNumber(string sheetpath)
{vector<string> numbers;ifstream infile(sheetpath);string str;// 一行行读取while (getline(infile, str)){string temp = str.substr(0, 11);numbers.push_back(temp.c_str());}// 关闭infile.close();return numbers;
}// 识别文件
void identifyFiles(std::string from, std::string to, std::string sheetpath, std::string suffix)
{vector<std::string> files;vector<std::string> filesname;// 如果文件夹不存在,则创建if (_access(to.c_str(), 0) == -1)int re = _mkdir(to.c_str());// 获取符合要求文件的信息getFiles(from, files, filesname, suffix);// 获取数字表vector<string> numbers = getNumber(sheetpath);// 识别int size = int(files.size());char* tf = new char[256];char* tn = new char[256];std::string target;for (int i = 0; i < size; i++) {// 若匹配成功则拷贝,失败则跳过if (isMatch(filesname[i], numbers)){target = to + filesname[i];strcpy(tf, files[i].c_str());strcpy(tn, target.c_str());copyFile(tf, tn);}}// 释放指针if (tn != NULL) {free(tn);tn = NULL;}if (tf != NULL) {free(tf);tf = NULL;}return;
}int main()
{string from = "C:\\Users\\Administrator\\Desktop\\current\\";string to = "C:\\Users\\Administrator\\Desktop\\target\\";string sheetpath= "C:\\Users\\Administrator\\Desktop\\current\\test.txt";cout << "start:" << endl;cout << " from:" << from << endl;cout << " to:" << to << endl;cout << " dictionary:" << sheetpath << endl;// 识别文件identifyFiles(from, to, sheetpath, "\\*.mp3");cout << "end." << endl;return 0;
}

测试效果

在测试案例中,我创建了一些mp3文件,并仿照需求进行命名,test.txt作为表格B。实测下来,getFiles函数可以做到只存储特设后缀的文件信息,并且匹配功能也能成功适应带空格的命名情况。

如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

C++-筛选文件夹中符合要求的文件并拷贝出来(以手机号码查找为例)相关推荐

  1. Python判断两个文件夹中互相不同的文件有哪些、判断一个文件夹相对于另外一个文件夹缺少了哪些文件

    Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些文件 目录 Python判断两个文件夹中互相不同的文件有哪些.判断一个文件夹相对于另外一个文件夹缺少了哪些 ...

  2. git在已忽略文件夹中不忽略指定文件

    注意:结尾的星号不能去,去掉就无效了 1.在已忽略文件夹中不忽略指定文件夹 /node_modules/* !/node_modules/layer/ 2.在已忽略文件夹中不忽略指定文件 /node_ ...

  3. 批量替换一个文件中的文件名,例如将文件夹中s**_abnormal.jpg文件修改为s**_abnor.jpg

    文章涉及到StringAbout::开头的函数具体实现参考:string与Cstring字符串类型转换和其他操作总结 CProcessFile::开头的函数实现参考:文件读写操作工具类CProcess ...

  4. matlab打开bmp,Matlab 读取文件夹中所有的bmp文件

    将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...

  5. java压缩zip文件夹错误_Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题)...

    项目场景: Java将文件或者文件夹压缩成zip(修复文件夹中存在多个文件报Stream Closed错误问题) 问题描述: 最近的项目需要将多级文件夹压缩成zip,网上找了几个工具类,都会报错,所以 ...

  6. 失物招领php_我的Mac上“失物招领”文件夹中的大型iNode文件是什么?

    失物招领php If you're trying to figure out what's taking up space on your Mac, you might stumble upon so ...

  7. 使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行

    标题使用cmd命令在桌面上新建一个文件夹,且在文件夹中新建一个.java文件,使用cmd命令实现.java文件的编译运行 1.在电脑桌面使用快捷键win+r打开 2.打开cmd命令界面之后使用md d ...

  8. python批量读取文件夹中的所有excel文件-python遍历文件夹下所有excel文件

    大数据处理经常要用到一堆表格,然后需要把数据导入一个list中进行各种算法分析,简单讲一下自己的做法: 1.如何读取excel文件 网上的版本很多,在xlrd模块基础上,找到一些源码: import ...

  9. .Net读取XP文件夹中的Thumbs.db文件

    一般在XP文件夹里面,特别是图片和视频文件夹里有一个文件-Thumbs.db文件.这个文件是XP用来缓存图片和影音文件的缩略图的,有了这个文件,XP在打开保存大量图片文件的文件夹的时候,显示速度会明显 ...

最新文章

  1. vc++图像保存,重绘
  2. 如何快速让你的站点进入灰白哀悼模式?
  3. Docker selenium自动化 - Python调用容器实例跑自动化查天气实例演示,docker selenium自动化环境部署过程
  4. linux下添加用户并赋予root权限
  5. React系列---Webpack环境搭建(二)不同环境不同配置
  6. 牛客练习赛69E-子串【树状数组】
  7. HDU1505(HDU1506的加强版)
  8. 架构师的第一步:学习两种抽象视角(Abstraction View)
  9. jQuery load和unload函数使用
  10. JAVA后台权限管理系统
  11. matlab巴特沃斯滤波器算法解释,巴特沃斯滤波器原理.doc
  12. 博帝 boost和威刚S102哪个好详细原创评测
  13. 经纬度坐标转换为大地2000怎么转换_XOMAP-爬虫[4]-零代码实现将quot;地址quot;转换为“经纬度”坐标及“结构化地址”...
  14. 信誉管理软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. Qt实用技巧:使用Qt加载超大图片的耗时测试
  16. 网络渗透实验1.0——网络扫描与网络侦察
  17. Note for Shell
  18. 【imx6ull-alientek-emmc】linux交叉编译环境 + 内核编译
  19. 《月亮与六便士》读后
  20. 【每日新闻】中国人工智能技术爆炸发展,美国开始落后?

热门文章

  1. linux如何运行windows游戏,Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
  2. 天猫APP也可以点外卖了 饿了么与天猫打通
  3. 计算机关闭网络发现还可以共享打印机吗,打印机不能共享或启用网络发现被自动关闭...
  4. 古墓新手机器人_《刺客信条:起源》新手前期技巧以及全古墓解法攻略
  5. 普通护照 首次申请 所需材料
  6. JAVA 编程中的汉字处理(1)---java 编程技术中汉子问题的分析与解决
  7. Rain and Tears
  8. CMake中add_definitions/add_compile_definitions的使用
  9. clickhouse索引
  10. Windows和Mac设置局域网共享