yhkylin-backup-tools/common/mydusizetool.cpp

115 lines
2.7 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mydusizetool.h"
#include <QDebug>
#include "utils.h"
MyDuSizeTool::MyDuSizeTool(QObject* parent) :
QObject(parent),
m_p(new QProcess(this))
{
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";
for (const QString& x : paths) {
cmd.append(QString(" \"%1\"").arg(x));
}
if (needExclude) {
for (const QString& item : excludePaths) {
QString arg = QString(" --exclude=\"%1\"").arg(item);
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);
}