Qt 批量替换指定文本为目标文本
之前写了一篇《批处理替换指定目录下所有文件夹名和文件名》,但是会存在些小问题,为了优雅的解决问题,打算用Qt开发个应用软件处理一下,同时把存在的问题都解决了。当然前提是目标机允许运行Qt打包的程序。
实现原理很简单,用QFileDialog让用户选择指定目录,通过深度优先搜索(DFS)逐层逐个遍历文件夹和文件,如果名称符合替换条件则替换相应的字符串,需要注意的是搜索时先搜索子文件夹内部再判断文件夹本身。
为了更方便使用,支持用户输入多个字符串,任意一个匹配成功即认为满足替换条件。例如在下图所示的软件界面中的指定文本,支持输入“aa$bb$cc”,如果文件名中带有aa或bb或cc,均视为满足替换条件,会自动替换为目标文本。
软件界面:
RenameFilesName.h
#ifndef RENAMEFILESNAME_H
#define RENAMEFILESNAME_H#include <QFileDialog>
#include <QWidget>
#include <QDebug>#if defined(_MSC_VER)
#pragma execution_character_set("utf-8")
#endifnamespace Ui {
class RenameFilesName;
}class RenameFilesName : public QWidget
{Q_OBJECTpublic:explicit RenameFilesName(QWidget *parent = 0);~RenameFilesName();protected:void dfsRequireFiles(QString path); // dfs文件列表bool dealIsContainsText(QString name, QString &newName); // 判断是否包含文本private slots:void on_pushButtonPicDir_clicked(); // 选取目录void on_pushButtonSearch_clicked(); // 开始查询private:Ui::RenameFilesName *ui;int m_numSuccess; // 替换成功的数量int m_numFailed; // 替换失败的数量int m_totFile; // 总文件数量int m_totDir; // 总文件夹数量
};#endif // RENAMEFILESNAME_H
RenameFilesName.cpp
#include "RenameFilesName.h"
#include "ui_RenameFilesName.h"RenameFilesName::RenameFilesName(QWidget *parent) :QWidget(parent),ui(new Ui::RenameFilesName)
{ui->setupUi(this);
}RenameFilesName::~RenameFilesName()
{delete ui;
}void RenameFilesName::dfsRequireFiles(QString path)
{QDir dir(path);QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks); // 获取文件列表QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); // 获取文件夹里列表for (int i = 0; i < file_list.size(); i++){++m_totFile;QString newName;if (dealIsContainsText(file_list.at(i).fileName(), newName)){QString originPath = file_list.at(i).absoluteFilePath();QString newPath = file_list.at(i).absolutePath() + "/" + newName;QDir dir(originPath);if (dir.rename(originPath, newPath)){ui->listWidget->addItem(newPath);++m_numSuccess;}else++m_numFailed;}}for (int i = 0; i != folder_list.size(); i++){QString name = folder_list.at(i).absoluteFilePath();++m_totDir;dfsRequireFiles(name); // 递归子目录QString newName;if (dealIsContainsText(folder_list.at(i).fileName(), newName)){QString originPath = folder_list.at(i).absoluteFilePath();QString newPath = folder_list.at(i).absolutePath() + "/" + newName;QDir dir(originPath);if (dir.rename(originPath, newPath)){ui->listWidget->addItem(newPath);++m_numSuccess;}else++m_numFailed;}}
}bool RenameFilesName::dealIsContainsText(QString name, QString &newName)
{QStringList listTargetStr = ui->lineEditText->text().split("$");for (int i = 0; i < listTargetStr.size(); ++i){if (name.contains(listTargetStr.at(i))){newName = name.replace(listTargetStr.at(i), ui->lineEditTargetText->text());return true;}}return false;
}void RenameFilesName::on_pushButtonPicDir_clicked()
{QString dirName = QFileDialog::getExistingDirectory(this, tr("打开目录"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);ui->lineEditDir->setText(dirName);
}void RenameFilesName::on_pushButtonSearch_clicked()
{ui->labelStatus->setText("查询开始!");QString dirName = ui->lineEditDir->text();ui->listWidget->clear();m_numSuccess = 0;m_numFailed = 0;m_totDir = 0;m_totFile = 0;dfsRequireFiles(dirName);ui->labelStatus->setText(QString("查询结束!共查询 %1 个子文件夹,%2 个子文件。其中,替换成功的有 %3 条,替换失败的有 %4 条。").arg(m_totDir).arg(m_totFile).arg(m_numSuccess).arg(m_numFailed));
}
实测效果:
在指定目录DisplayImage里,将所有文件名中数字前的前缀统一命名为Image。
分析一下文件名,前缀中不符合规范的命名有image、IMAGE、IME、IMG四种,所以在软件的指定文本中输入image$IMAGE$IME$IMG,目标文本输入Image,点击“开始替换”即可。
修改后效果:
Qt 批量替换指定文本为目标文本相关推荐
- 使用Python批量替换指定目录所有文件中的指定文本
使用Python批量替换指定目录所有文件中的指定文本 # -*- coding: utf-8 -*- import os from = "aaa" #替换为什么内容,可以是多行 t ...
- mysql数据库字段字符转数字批量语句_MySQL数据库批量替换指定字段字符串SQL语句命令...
MySQL批量替换是我们经常会用到的功能,有时站内包含敏感词,会给我们带来麻烦,而在信息量较大的情况下,一篇篇查找.修改是不现实的.用MySQL批量替换,甚是轻松.发布在这里供参考,以备不时之需. M ...
- 利用MySQL语句批量替换指定wordpress文章中的图片路径
天花了很多时间将SAE服务器中的图片下载到本地,然后删掉,但是有一个问题就是,所有文章中的图片路径还是以前的,没有根据域名来.导致下午某些时间段图片都是无法显示的,后来想到用MySQL直接批量替换,执 ...
- mysql一键更改图片地址_利用mysql语句批量替换指定wordpress文章图片路径
有时候当你看到一篇十分优秀的国外文章的时候,比如说十个优秀.五十个优秀的网站设计欣赏.wordpress主题下载.jquery插件下载等等. 这些文章当中往往会跟随大量的示例图片供读者查看,如果这些文 ...
- Excel如何在整个工作簿中批量替换指定数据
今天跟大家分享一下Excel如何在整个工作簿中批量替换 1.下面以下图为例跟大家介绍一下怎么批量替换整个工作簿数据. 2.首先我们点击下图选项 3.单击[更多].[批量替换] 4.选择全部工作表,然后 ...
- 怎么将 Excel 中的第一个工作表或者其它指定的工作表批量替换成新的内容?
概要:在我们日常办公中,经常会碰到需要替换 Excel 中的某一个 Sheet 或者某几个 Sheet 的功能,「我的ABC软件工具箱」就实现了批量替换指定 Sheet 的功能,可以轻松实现对 Exc ...
- 怎么将 Word、PPT、PDF 中的第一页、最后一页以及其它指定页批量替换成新的内容?
概要:在我们日常办公中,经常会碰到需要替换文档中的某一页或者某几页的功能,「我的ABC软件工具箱」就实现了批量替换指定页的功能,可以轻松实现对 Word.PPT.PDF 文件的第一页.最后一页以及其他 ...
- html防替换资源,蓝梦HTML批量替换工具免费版
非常不错的文本批量替换软件,蓝梦HTML批量替换工具免费版为用户提供了两种不同的替换方式,以满足不同的情况,蓝梦HTML批量替换工具免费版不需要安装,没有任何广告弹窗,界面十分简洁,在日常办公中经常需 ...
- Linux下批量替换文件内容和文件名(转)
1.批量替换指定多个文件的文件内容 在指定目录/your/path里,查找包含old_string字符串的所有文件,并用new_string字符串替换old_string字符串. sed -i &qu ...
- BAT批量替换文件内容
BAT批量操作 1.批量替换指定文件指定内容 案列:将test.txt文本中的inflie替换为outfile @echo off setlocal EnableDelayedExpansion se ...
最新文章
- 爬虫-windows下安装Scrapy及scrapy模块介绍
- 通俗理解决策树算法中信息增益的
- Linux进程通信之mmap
- 计算机网络第1章概述
- android 7.0添加菜单,Android 7.0 settings中添加/删除菜单
- 层次分析法(小白必看手机查看)
- 数据中心存储改造方案
- indesign排版标点挤压_indesign排版标点挤压设置技巧
- redis实现CAS
- Python实例——国际标准书号(ISBN)的计算
- 经典管理学定律4 - 鲶鱼效应
- java switch语句怎么写,java怎么用switch语句
- oracle会计科目明细请求,Oracle EBS R12财务月结基础
- django开发一个管理系统基于Python实现的酒店住房管理系统
- nkd 编译ffmpeg错误: clang is unable to create an executable file. C compiler test failed.
- python include_python中的include()是什么?它和进口有什么不同?
- CorelDRAWX4的VBA插件开发(十)多文件编程
- 个人关于web开发浅尝辄止,web开发概览
- 将Yolo格式标注文件转换为VOC格式
- WML语法全接触 WAP建站语言