| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461 |
- #include "renamewin.h"
- #include "progresswin.h"
- #include <QFileDialog>
- #include <QRadioButton>
- #include <QMessageBox>
- #include <QInputDialog>
- //批量修改文件夹下文件名称的功能
- ReNameWin::ReNameWin(QWidget *parent)
- : QWidget(parent), m_extComBoxNum(0)
- {
- ui.setupUi(this);
- connect(ui.radioButtonAddPrefix, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(1,status); });
- connect(ui.radioButtonDelPrefix, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(2, status); });
- connect(ui.radioButtonAddSuffix, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(3, status); });
- connect(ui.radioButtonDelSuffix, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(4, status); });
- connect(ui.radioButtonLower, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(5, status); });
- connect(ui.radioButtonUpper, &QRadioButton::toggled, this, [this](bool status) {slot_renameOptionsChange(6, status); });
- }
- ReNameWin::~ReNameWin()
- {
- }
- void ReNameWin::slot_selectDir()
- {
- QString workDir = ui.lineEditDir->text();
- QString rootpath = QFileDialog::getExistingDirectory(this, tr("Open Directory"), workDir, QFileDialog::DontResolveSymlinks);
- if (!rootpath.isEmpty())
- {
- ui.lineEditDir->setText(rootpath);
- }
- }
- //改名,前缀后缀名称的修改
- void ReNameWin::slot_renameOptionsChange(int id, bool status)
- {
- switch (id)
- {
- case 1:
- ui.lineEditAddPrefix->setEnabled(status);
- break;
- case 2:
- ui.lineEditDelPrefix->setEnabled(status);
- break;
- case 3:
- ui.lineEditAddSuffix->setEnabled(status);
- break;
- case 4:
- ui.lineEditDelSuffix->setEnabled(status);
- break;
- default:
- break;
- }
- }
- void ReNameWin::slot_userDefineExt()
- {
- bool ok = false;
- QString text = QInputDialog::getText(this, tr("input file ext()"), tr("ext (Start With .)"), QLineEdit::Normal, QString(".cpp"), &ok);
- if (ok && !text.isEmpty())
- {
- text = text.trimmed();
- ui.comboBoxExt->addItem(text);
- ++m_extComBoxNum;
- ui.comboBoxExt->setCurrentIndex(m_extComBoxNum);
- }
- }
- void ReNameWin::slot_startRename()
- {
- if (ui.optionsTab->currentIndex() == 0)
- {
- changeFileName();
- }
- else if (ui.optionsTab->currentIndex() == 1)
- {
- changeFileExt();
- }
-
- }
- void ReNameWin::changeFileName()
- {
- QString dealDir = ui.lineEditDir->text();
- if (dealDir.isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Select Dir"));
- return;
- }
- int type = -1;
- QString extrenFileName;
- bool addPrefix = ui.radioButtonAddPrefix->isChecked();
- if (addPrefix && ui.lineEditAddPrefix->text().isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Input Add File Prefix"));
- return;
- }
- if (addPrefix)
- {
- type = 0;
- extrenFileName = ui.lineEditAddPrefix->text();
- }
- bool delPrefix = ui.radioButtonDelPrefix->isChecked();
- if (delPrefix && ui.lineEditDelPrefix->text().isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Input Del File Prefix"));
- return;
- }
- if (delPrefix)
- {
- type = 1;
- extrenFileName = ui.lineEditDelPrefix->text();
- }
- bool addSuffix = ui.radioButtonAddSuffix->isChecked();
- if (addSuffix && ui.lineEditAddSuffix->text().isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Input Add File Suffix"));
- return;
- }
- if (addSuffix)
- {
- type = 2;
- extrenFileName = ui.lineEditAddSuffix->text();
- }
- bool delSuffix = ui.radioButtonDelSuffix->isChecked();
- if (delSuffix && ui.lineEditDelSuffix->text().isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Input Del File Suffix"));
- return;
- }
- if (delSuffix)
- {
- type = 3;
- extrenFileName = ui.lineEditDelSuffix->text();
- }
- bool toLowerFileName = ui.radioButtonLower->isChecked();
- if (toLowerFileName)
- {
- type = 4;
- }
- bool toUpperFileName = ui.radioButtonUpper->isChecked();
- if (toUpperFileName)
- {
- type = 5;
- }
- if (type == -1)
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Select One Operator"));
- return;
- }
- QList<QString> dirsList;
- dirsList.append(dealDir);
- int fileNums = 0;
- int failNums = 0;
- bool dealChildDir = ui.checkBoxDealChildDir->isChecked();
- QString oldName;
- QString newName;
- auto getNewName = [](QString oldName, int type, const QString& addOrDelFix)->QString {
- QFileInfo fi(oldName);
- QDir dir = fi.absoluteDir();
- switch (type)
- {
- //增加前缀
- case 0:
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(addOrDelFix+fi.baseName()).arg(fi.suffix());
- case 1:
- {//删除前缀
- if (fi.baseName().startsWith(addOrDelFix) && (fi.baseName() != addOrDelFix))
- {
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(fi.baseName().mid(addOrDelFix.length())).arg(fi.suffix());
- }
- }
- break;
- case 2:
- {
- //增加后缀
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(fi.baseName()+ addOrDelFix).arg(fi.suffix());
- }
- break;
- case 3:
- //删除后缀
- {
- if (fi.baseName().endsWith(addOrDelFix) && (fi.baseName() != addOrDelFix))
- {
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(fi.baseName().mid(0, fi.baseName().length() - addOrDelFix.length())).arg(fi.suffix());
- }
- }
-
- break;
- case 4:
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(fi.baseName().toLower()).arg(fi.suffix());
- case 5:
- return QString("%1/%2.%3").arg(dir.absolutePath()).arg(fi.baseName().toUpper()).arg(fi.suffix());
- default:
- break;
- }
- return QString();
- };
- ProgressWin* m_loadFileProcessWin = new ProgressWin(this);
- m_loadFileProcessWin->setWindowModality(Qt::WindowModal);
- m_loadFileProcessWin->info(tr("rename file in progress, please wait ..."));
- m_loadFileProcessWin->show();
- int processTotal = 0;
- bool isExistChildDir = false;
- while (!dirsList.isEmpty())
- {
- QString path = dirsList.takeFirst();
- /*添加path路径文件*/
- QDir dir(path);
- //遍历各级子目录
- if (dealChildDir)
- {
- QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::NoSymLinks); //获取当前所有目录
- for (int i = 0; i != folder_list.size(); ++i) //自动递归添加各目录到上一级目录
- {
- QString namepath = folder_list.at(i).absoluteFilePath(); //获取路径
- //必须放前面,因为以文件夹个数处理为进度条计数
- dirsList.push_front(namepath);
- }
- if ((processTotal == 0) && dirsList.size() > 0)
- {
- //以目录个数大概去统计进度
- processTotal = dirsList.size();
- m_loadFileProcessWin->setTotalSteps(processTotal);
- isExistChildDir = true;
- }
- if (dirsList.size() < processTotal)
- {
- m_loadFileProcessWin->moveStep();
- }
- }
- QDir dir_file(path);
- dir_file.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);//获取当前所有文件
- QFileInfoList list_file = dir_file.entryInfoList();
- //说明没有子文件夹
- if ((processTotal == 0) && list_file.size() > 0)
- {
- processTotal = list_file.size();
- m_loadFileProcessWin->setTotalSteps(processTotal);
- }
- for (int i = 0; i < list_file.size(); ++i)
- {
- QFileInfo fileInfo = list_file.at(i);
- oldName = fileInfo.absoluteFilePath();
- newName = getNewName(oldName,type, extrenFileName);
- if (!newName.isEmpty() && (newName != oldName))
- {
- if (!QFile::rename(oldName, newName))
- {
- failNums++;
- m_loadFileProcessWin->info(tr("failed %1 file path %2, please check").arg(failNums).arg(oldName));
- }
- fileNums++;
- }
- //没有子文件夹时,按文件数量走
- if (!isExistChildDir)
- {
- m_loadFileProcessWin->moveStep();
- }
- }
- }
- QMessageBox::information(this, tr("Notice"), tr("Deal Finished, totol %1 files, failed %2 files").arg(fileNums).arg(failNums));
- delete m_loadFileProcessWin;
- }
- void ReNameWin::changeFileExt()
- {
- QString dealDir = ui.lineEditDir->text();
- QString destExt = ui.lineEditDestExt->text();
- if (destExt.startsWith('.'))
- {
- destExt = destExt.mid(1, destExt.length() - 1);
- }
- if (dealDir.isEmpty() || destExt.isEmpty())
- {
- QMessageBox::warning(this, tr("Notice"), tr("Please Select Dir Or Dest Ext"));
- return;
- }
- QString filterExt;
- bool isNeedFilterExt = false;
- if (0 != ui.comboBoxExt->currentIndex())
- {
- filterExt = ui.comboBoxExt->currentText();
- if (filterExt.startsWith('.'))
- {
- filterExt = filterExt.mid(1, filterExt.length() - 1);
- }
- }
- //检查是否需要过滤只处理ext类型
- if (!filterExt.isEmpty())
- {
- isNeedFilterExt = true;
- }
- QList<QString> dirsList;
- dirsList.append(dealDir);
- int fileNums = 0;
- int failNums = 0;
- bool dealChildDir = ui.checkBoxDealChildDir->isChecked();
- QString oldName;
- QString newName;
- auto getNewName = [](QString oldName, const QString& destExt)->QString{
- QFileInfo fi(oldName);
- //没有后缀名,则不修改
- if (fi.suffix().isEmpty())
- {
- return QString();
- }
- int oldExtSize = fi.suffix().length();
- return QString("%1%2").arg(oldName.mid(0, oldName.size()-oldExtSize)).arg(destExt);
- };
- ProgressWin* m_loadFileProcessWin = new ProgressWin(this);
-
- m_loadFileProcessWin->setWindowModality(Qt::WindowModal);
- m_loadFileProcessWin->info(tr("rename file in progress, please wait ..."));
- m_loadFileProcessWin->show();
- int processTotal = 0;
- bool isExistChildDir = false;
- while (!dirsList.isEmpty())
- {
- QString path = dirsList.takeFirst();
- /*添加path路径文件*/
- QDir dir(path);
- //遍历各级子目录
- if (dealChildDir)
- {
- QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::NoSymLinks); //获取当前所有目录
- for (int i = 0; i != folder_list.size(); ++i) //自动递归添加各目录到上一级目录
- {
- QString namepath = folder_list.at(i).absoluteFilePath(); //获取路径
- //必须放前面,因为以文件夹个数处理为进度条计数
- dirsList.push_front(namepath);
- }
- if ((processTotal == 0) && dirsList.size() > 0)
- {
- //以目录个数大概去统计进度
- processTotal = dirsList.size();
- m_loadFileProcessWin->setTotalSteps(processTotal);
- isExistChildDir = true;
- }
- if (dirsList.size() < processTotal)
- {
- m_loadFileProcessWin->moveStep();
- }
- }
- QDir dir_file(path);
- dir_file.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);//获取当前所有文件
- QFileInfoList list_file = dir_file.entryInfoList();
- //说明没有子文件夹
- if ((processTotal == 0) && list_file.size() > 0)
- {
- processTotal = list_file.size();
- m_loadFileProcessWin->setTotalSteps(processTotal);
- }
- for (int i = 0; i < list_file.size(); ++i)
- {
- QFileInfo fileInfo = list_file.at(i);
- oldName = fileInfo.absoluteFilePath();
- if (isNeedFilterExt)
- {
- if (fileInfo.suffix() != filterExt)
- {
- continue;
- }
- }
- newName = getNewName(oldName, destExt);
- if (!newName.isEmpty() && (newName != oldName))
- {
- if (!QFile::rename(oldName, newName))
- {
- failNums++;
- m_loadFileProcessWin->info(tr("failed %1 file path %2, please check").arg(failNums).arg(oldName));
- }
- }
- //没有子文件夹时,按文件数量走
- if (!isExistChildDir)
- {
- m_loadFileProcessWin->moveStep();
- }
- }
- fileNums += list_file.size();
- }
- QMessageBox::information(this, tr("Notice"), tr("Deal Finished, totol %1 files, failed %2 files").arg(fileNums).arg(failNums));
- delete m_loadFileProcessWin;
- }
|