删除Typora中存留的多余图片
直接上代码
可在上方资源下载代码
deluselesspicoftypora.h
#ifndef DELUSELESSPICOFTYPORA_H
#define DELUSELESSPICOFTYPORA_H
#include <QMainWindow>
#include <QFileInfoList>
#include <QMap>
QT_BEGIN_NAMESPACE
namespace Ui {
class delUselessPicOfTypora;
}
QT_END_NAMESPACE
class delUselessPicOfTypora : public QMainWindow
{
Q_OBJECT
public:
delUselessPicOfTypora(QWidget *parent = nullptr);
~delUselessPicOfTypora();
private:
void addPic();
void findMdFiles(const QString &directoryPath);
QStringList extractPicNameFromMd(const QString& mdPath);
private slots:
void on_pushButton_PicFileDialog_clicked();
void on_pushButton_mdFileDialog_clicked();
void on_pushButton_del_clicked();
private:
Ui::delUselessPicOfTypora *ui;
QString m_picDir;
QString m_mdDir;
QFileInfoList m_picList;
QStringList m_mdList;
QMap<QString, bool> m_mapMdPic;
};
#endif // DELUSELESSPICOFTYPORA_H
deluselesspicoftypora.cpp
#include "deluselesspicoftypora.h"
#include "./ui_deluselesspicoftypora.h"
#include <QFileDialog>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QDebug>
delUselessPicOfTypora::delUselessPicOfTypora(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::delUselessPicOfTypora)
{
ui->setupUi(this);
}
delUselessPicOfTypora::~delUselessPicOfTypora()
{
delete ui;
}
void delUselessPicOfTypora::addPic()
{
// 设置要遍历的目录
QDir dir(m_picDir);
// 设置过滤器,这里假设我们只关心普通文件
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
// 获取目录下所有文件的信息
m_picList = dir.entryInfoList();
// 遍历QFileInfoList
// for (int i = 0; i < list.size(); ++i) {
// QFileInfo fileInfo = list.at(i);
// // 将文件名添加到QStringList中
// m_picList.append(fileInfo.fileName());
// }
// 打印所有文件名,仅用于验证
// foreach (const QString &fileName, m_picList) {
// ui->textEdit_show->append(fileName);
// }
}
void delUselessPicOfTypora::findMdFiles(const QString &directoryPath)
{
QDir dir(directoryPath);
// 设置过滤器以查找文件和目录,但排除特殊目录"."和".."
dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
// 设置过滤器以只查找.md文件
// QStringList filters;
// filters << "*.md";
// dir.setNameFilters(filters);
// 获取目录中的所有项(包括文件和子目录)
QFileInfoList list = dir.entryInfoList();
for (const QFileInfo &fileInfo : list) {
if (fileInfo.isDir()) {
// 如果是目录,则递归调用此函数
findMdFiles(fileInfo.absoluteFilePath());
} else if (fileInfo.isFile() &&
!fileInfo.suffix().compare("md", Qt::CaseInsensitive)) {
// 如果是md文件,打印文件路径
// ui->textEdit_show->append(fileInfo.absoluteFilePath());
// 放入list
m_mdList.append(fileInfo.absoluteFilePath());
}
}
}
QStringList delUselessPicOfTypora::extractPicNameFromMd(const QString &mdPath)
{
QFile file(mdPath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "无法打开文件:" << mdPath;
return QStringList();
}
QTextStream in(&file);
QString content = in.readAll();
file.close();
// 创建一个正则表达式来匹配Markdown图片格式,并捕获小括号中的内容
QRegularExpression re("!\\[.*?\\]\\((.*?)\\)");
QRegularExpressionMatchIterator i = re.globalMatch(content);
QStringList capturedPaths;
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
QString captured = match.captured(1); // 提取第一个捕获组的内容,即小括号中的路径
capturedPaths.append(captured);
}
return capturedPaths;
}
void delUselessPicOfTypora::on_pushButton_PicFileDialog_clicked()
{
m_picDir = QFileDialog::getExistingDirectory(nullptr, "选择文件夹", "",
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
ui->lineEdit_picFileDialog->setText(m_picDir);
}
void delUselessPicOfTypora::on_pushButton_mdFileDialog_clicked()
{
m_mdDir = QFileDialog::getExistingDirectory(nullptr, "选择文件夹", "",
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
ui->lineEdit_mdFileDialog->setText(m_mdDir);
}
void delUselessPicOfTypora::on_pushButton_del_clicked()
{
addPic();
findMdFiles(m_mdDir);
// 将所有md中引用的图片的图片名提取出来,并放入map中
foreach (const auto& mdpath, m_mdList) {
QStringList listMdPicPath = extractPicNameFromMd(mdpath);
foreach (const auto& mdPicPath, listMdPicPath) {
QStringList mdPicPathSplit = mdPicPath.split('/');
QString mdPicName = mdPicPathSplit.at(mdPicPathSplit.size() - 1);
// 加入map
m_mapMdPic[mdPicName] = 1;
// ui->textEdit_show->append(mdPicName);
}
}
foreach (const auto& picinfo, m_picList) {
// 如果图片文件夹中的图片不存在map中则删除
if (!m_mapMdPic.contains(picinfo.fileName()))
{
ui->textEdit_show->append(picinfo.absoluteFilePath());
QFile::remove(picinfo.absoluteFilePath());
}
}
}
main.cpp
#include "deluselesspicoftypora.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
delUselessPicOfTypora w;
w.show();
return a.exec();
}