删除Typora中存留的多余图片

删除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();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值