yhkylin-backup-tools/common/mydusizetool.cpp

115 lines
2.7 KiB
C++
Raw Normal View History

2021-08-17 10:07:35 +08:00
#include "mydusizetool.h"
#include <QDebug>
#include "utils.h"
2021-08-24 18:08:18 +08:00
MyDuSizeTool::MyDuSizeTool(QObject* parent) :
QObject(parent),
m_p(new QProcess(this))
2021-08-17 10:07:35 +08:00
{
connect(m_p, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus)));
connect(m_p, &QProcess::readyReadStandardError, this, [&]() {
QByteArray err = m_p->readAllStandardError();
qCritical("du process error: %s", err.data());
});
}
MyDuSizeTool::~MyDuSizeTool()
{
delete m_p;
}
/**
* @brief MyDuSizeTool::Do
* @param paths, du计算路径列表
* @param excludePathsdu排查路径列表
* @param blockbool,
* @return
*/
qint64 MyDuSizeTool::Do(QStringList paths, QStringList excludePaths, bool block)
{
return _Do(paths, excludePaths, true, block);
}
/**
* @brief MyDuSizeTool::_Do
* @param paths, du计算路径列表
* @param excludePathsdu排查路径列表
* @param needExcludebool
* @param blockbool,
* @return
*/
qint64 MyDuSizeTool::_Do(QStringList paths, QStringList excludePaths, bool needExclude, bool block)
{
Init(paths, excludePaths);
if (paths.isEmpty()) {
qCritical("du paths is empty!");
return -1;
}
if (needExclude && excludePaths.isEmpty()) {
qCritical("du excludepaths is empty!");
return -1;
}
QString cmd = "du";
2021-08-19 19:24:49 +08:00
for (const QString& x : paths) {
2021-08-17 10:07:35 +08:00
cmd.append(QString(" \"%1\"").arg(x));
}
if (needExclude) {
2021-08-19 19:24:49 +08:00
for (const QString& item : excludePaths) {
QString arg = QString(" --exclude=\"%1\"").arg(item);
2021-08-17 10:07:35 +08:00
cmd.append(arg);
}
}
cmd.append(" -sb | tail -1 | awk -F \" \" '{print $1}'");
qDebug("cmd is %s", cmd.toStdString().c_str());
QStringList Args;
Args << "-c" << cmd;
m_p->start("bash", Args);
if (!m_p->waitForStarted())
return -1;
if (block) {
if (!m_p->waitForFinished(-1)) {
return -1;
}
return m_size;
}
return 0;
}
/**
* @brief MyDuSizeTool::Do
* @param paths, du计算路径列表
* @param excludePathsdu排查路径列表
* @param blockbool,
* @return
*/
qint64 MyDuSizeTool::Do(QStringList paths, bool block)
{
return _Do(paths, {}, false, block);
}
void MyDuSizeTool::Init(QStringList paths, QStringList excludePaths)
{
m_paths = paths;
m_excludePaths = excludePaths;
}
void MyDuSizeTool::finished(int, QProcess::ExitStatus)
{
QString result = m_p->readAll();
if (result.isEmpty())
m_size = 0;
else
m_size = result.toLongLong();
emit duFinished(m_size);
}