You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
4.2 KiB
C++
221 lines
4.2 KiB
C++
#include "common.h"
|
|
|
|
#include "cfile.h"
|
|
|
|
#include <QApplication>
|
|
|
|
#include <QFile>
|
|
#include <QTextStream>
|
|
|
|
|
|
cFile::cFile() :
|
|
m_dir(""),
|
|
m_file(""),
|
|
m_dateTime(QDateTime()),
|
|
m_size(0)
|
|
{
|
|
}
|
|
|
|
cFile::cFile(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size) :
|
|
m_dir(dir),
|
|
m_file(file),
|
|
m_dateTime(dateTime),
|
|
m_size(size)
|
|
{
|
|
}
|
|
|
|
cFile::~cFile()
|
|
{
|
|
}
|
|
|
|
bool cFile::compare(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size)
|
|
{
|
|
if(!dir.isNull() && dir != m_dir)
|
|
return(false);
|
|
if(!file.isNull() && file != m_file)
|
|
return(false);
|
|
if(!dateTime.isNull() && dateTime != m_dateTime)
|
|
return(false);
|
|
if(size != -1 && size != m_size)
|
|
return(false);
|
|
return(true);
|
|
}
|
|
|
|
QString cFile::dir()
|
|
{
|
|
return(m_dir);
|
|
}
|
|
|
|
QString cFile::file()
|
|
{
|
|
return(m_file);
|
|
}
|
|
|
|
QDateTime cFile::dateTime()
|
|
{
|
|
return(m_dateTime);
|
|
}
|
|
|
|
qint64 cFile::size()
|
|
{
|
|
return(m_size);
|
|
}
|
|
|
|
bool cFile::operator==(const cFile& other) const
|
|
{
|
|
if(g_bMatchDir)
|
|
if(m_dir != other.m_dir)
|
|
return(false);
|
|
if(g_bMatchFile)
|
|
if(m_file != other.m_file)
|
|
return(false);
|
|
if(g_bMatchDateTime)
|
|
if(m_dateTime != other.m_dateTime)
|
|
return(false);
|
|
if(g_bMatchSize)
|
|
if(m_size != other.m_size)
|
|
return(false);
|
|
|
|
return(true);
|
|
}
|
|
|
|
void cFileList::parseLine(const QString& curDir, const QString& line)
|
|
{
|
|
QString date;
|
|
QString time;
|
|
QString size;
|
|
QString file;
|
|
QString dir;
|
|
|
|
date = line.left(10);
|
|
time = line.mid(12, 5);
|
|
size = line.mid(17, 18);
|
|
file = line.mid(36);
|
|
dir = curDir;
|
|
|
|
size = size.replace("(", "").replace(")", "").replace(QChar(0xA0), "").replace(" ", "").replace(".", "");
|
|
|
|
QDateTime dateTime = QDateTime(QDate::fromString(date, "dd.MM.yyyy"), QTime::fromString(time, "hh:mm"));
|
|
|
|
add(dir.replace("\\", "/"), file, dateTime, size.toLongLong(), false);
|
|
}
|
|
|
|
void cFileList::parseDir(const QString& dir, QStatusBar* lpStatusBar)
|
|
{
|
|
QDir _dir(dir);
|
|
|
|
if(lpStatusBar)
|
|
{
|
|
lpStatusBar->showMessage(_dir.path());
|
|
qApp->processEvents();
|
|
}
|
|
|
|
QFileInfoList fileList = _dir.entryInfoList(QDir::Files, QDir::Name);
|
|
|
|
for(QFileInfoList::iterator i = fileList.begin();i != fileList.end();i++)
|
|
add(_dir.path(), i->fileName(), i->birthTime(), i->size(), false);
|
|
|
|
|
|
QStringList dirList = _dir.entryList(QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDir::Name);
|
|
|
|
for(QStringList::iterator i = dirList.begin();i != dirList.end();i++)
|
|
{
|
|
parseDir(dir + QDir::separator() + *i, lpStatusBar);
|
|
}
|
|
}
|
|
|
|
bool cFileList::load(const QString& file, QProgressBar* lpProgressBar)
|
|
{
|
|
clear();
|
|
|
|
QFile inFile(file);
|
|
|
|
if(!inFile.open(QIODevice::ReadOnly))
|
|
return(false);
|
|
|
|
qint64 cur = 0;
|
|
qint64 max = inFile.size();
|
|
|
|
lpProgressBar->setRange(0, 100);
|
|
QTextStream in(&inFile);
|
|
|
|
QString curDir = "";
|
|
|
|
while(!in.atEnd())
|
|
{
|
|
QString line = in.readLine();
|
|
cur += line.length()+2;
|
|
|
|
if(line.left(17) == " Volume in drive ")
|
|
continue;
|
|
else if(line.left(25) == " Volume Serial Number is ")
|
|
continue;
|
|
else if(line.isEmpty())
|
|
continue;
|
|
else if(line.left(4) == " ")
|
|
continue;
|
|
else if(line.contains("<DIR>"))
|
|
continue;
|
|
else if(line.left(14) == " Directory of ")
|
|
curDir = line.mid(14);
|
|
else
|
|
parseLine(curDir, line);
|
|
|
|
lpProgressBar->setValue(static_cast<int>(cur*100/max));
|
|
qApp->processEvents();
|
|
}
|
|
|
|
inFile.close();
|
|
|
|
return(true);
|
|
}
|
|
|
|
bool cFileList::load(const QString& dir, QStatusBar* lpStatusBar)
|
|
{
|
|
clear();
|
|
|
|
parseDir(dir, lpStatusBar);
|
|
|
|
return(true);
|
|
}
|
|
|
|
cFile* cFileList::add(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size, bool search)
|
|
{
|
|
cFile* lpFile = nullptr;
|
|
|
|
if(search)
|
|
lpFile = find(dir, file, dateTime, size);
|
|
|
|
if(!lpFile)
|
|
{
|
|
lpFile = new cFile(dir, file, dateTime, size);
|
|
append(*lpFile);
|
|
}
|
|
return(lpFile);
|
|
}
|
|
|
|
cFile* cFileList::find(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size)
|
|
{
|
|
for(cFileList::iterator i = begin();i != end();i++)
|
|
{
|
|
if(i->compare(dir, file, dateTime, size))
|
|
return(&(*i));
|
|
}
|
|
return(nullptr);
|
|
}
|
|
|
|
bool cFileList::contains(cFile& file, bool bDir, bool bFile, bool bDate, bool bSize)
|
|
{
|
|
g_bMatchDir = bDir;
|
|
g_bMatchFile = bFile;
|
|
g_bMatchDateTime = bDate;
|
|
g_bMatchSize = bSize;
|
|
|
|
return(QList::contains(file));
|
|
}
|
|
|
|
bool cFileList::contains(cFile& file)
|
|
{
|
|
return(QList::contains(file));
|
|
}
|