概述
名称:冗余文件清除工具
功能:删除指定路径下的所有拷贝文件,删除指定文件的拷贝文件,删除模糊字符串匹配的所有文件的拷贝文件
原理:通过读取文件的内容从而计算出该文件的MD5值(MD5值可以通过文件内容来唯一标识文件(相同内容的文件的MD5值相同,内容任何有一点不同的文件的MD5值会截然不同)),将其文件名与MD5的对应关系存放在多个不同的关联式容器内,从而找出相同内容的文件(拷贝文件),进行文件操作。
设计模块关系:
设计思路框图:
重点模块
file_manager
承上启下的模块,通过project_MD5模块中的一系列计算,将制定的文件的MD5值输出,然后通过file_tool模块中的删除文件和扫描文件的接口来辅助操作。
file_manager的重点是主要利用三个关联式容器的成员:std::unordered_setstd::string _files_list(存放所有的文件名)、std::unordered_map<std::string, std::string> _fileTomd5(存放file->MD5值)、std::unordered_multimap<std::string, std::string> _md5Tofile(存放MD5值->file)。
在这个模块里的主要功能就是搜盘和删除。值得注意的是:在搜盘和删除的时候,在有相关处理这三个容器的时候,一定要同步操作,同步增删。
模糊匹配删除:输入的部分字符串, 用string的find函数,注意:这里的find不是去找string数组,而是找一个string中是否find到(包含)了输入的部分字符串。
源码
APP—file_manager.h
#pragma once
#include"file_manager.h"
class file_app
{
public:
//展示菜单
void menu_show();
//菜单
void menu();
//扫描文件
void scanner();
//按照名字删除
void delete_by_name();
//删除模糊匹配文件名的文件
void delete_by_match_name();
//删除所有的副本
void delete_all_copy();
//展示所有副本
void show_all_copy();
//展示所有文件
void show_all_files();
private:
FileManager _fm;
};
APP—file_manager.cpp
#pragma once
#include<iostream>
#include"APP—file_manager.h"
//扫描文件
void file_app::scanner()
{
std::string path;
std::cout << "请输入文件夹目录:" << std::endl;
std::getline(std::cin, path);
_fm.scan_dir(path);
}
//按照名字删除
void file_app::delete_by_name()
{
std::string name;
std::cout << "请输入文件名称(带路径):" << std::endl;
std::getline(std::cin, name);
_fm.delete_by_name(name);
}
//删除模糊文件名的文件
void file_app::delete_by_match_name()
{
std::string name;
std::cout << "请输入文件的部分字符串:" << std::endl;
std::getline(std::cin, name);
_fm.delete_by_match_name(name);
}
//删除所有的副本
void file_app::delete_all_copy()
{
_fm.delete_all_copy();
}
//展示所有副本
void file_app::show_all_copy()
{
_fm.showCopylist();
}
//展示所有文件
void file_app::show_all_files()
{
_fm.showAllfile();
}
//展示菜单
void file_app::menu_show()
{
std::cout << "---------------------------磁盘文件管理工具--------------------------" << std::endl;
std::cout << "| 0、exit 1、scan 2、delete by name 3、delete by match name |" << std::endl;
std::cout << "| 4、delete all copy 5、show all copy 6、show all files |" << std::endl;
std::cout << "---------------------------------------------------------------------" << std::endl;
std::cout << "--------------------------------请选择-------------------------------" << std::endl;
}
//菜单
void file_app::menu()
{
int input;
do
{
menu_show();
std::cin >> input;
std::string garbage;
getline(std::cin, garbage);
switch (input)
{
case 1:
scanner();
break;
case 2:
delete_by_name();
break;
case 3:
delete_by_match_name();
break;
case 4:
delete_all_copy();
break;
case 5:show_all_copy();
break;
case 6:show_all_files();
break;
default:
break;
}
} while (input);
}
file_manager.h
#pragma once
#include<string>
#include<unordered_map>
#include<unordered_set>
#include"project_MD5.h"
class FileManager
{
public:
//扫描输入路径下的文件
void scan_dir(const std::string& path);
//将文件与MD5存入多个关联式容器
void get_MD5_to_file();
//得到拷贝的文件列表
void get_copy_list();
//通过文件名删除文件
void delete_by_name(const std::string& filename);
//通过MD5值删除文件
void delete_by_MD5(const std::string& MD5num);
void delete_by_MD5_lv2(const std::string& MD5num);
//删除所有拷贝的文件
void delete_all_copy();
//删除模糊匹配文件名的文件
void delete_by_match_name(const std::string& filename);
void showCopylist();
void showAllfile();
private:
std::unordered_set<std::string> _files_list;
//存放file->MD5值
std::unordered_map<std::string, std::string> _fileTomd5;
//存放MD5值->file
std::unordered_multimap<std::string, std::string> _md5Tofile;
MD5 _md5;
};
file_manager.cpp