diff --git a/cfile.cpp b/cfile.cpp new file mode 100644 index 0000000..eae91e0 --- /dev/null +++ b/cfile.cpp @@ -0,0 +1,135 @@ +#include "cfile.h" + +#include +#include + + +cFile::cFile(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size, QObject* parent) : + QObject(parent), + 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); +} + +void cFileList::parseLine(const QString& curDir, const QString& line) +{ + QString date; + QString time; + QString size; + QString file; + + date = line.left(10); + time = line.mid(12, 5); + size = line.mid(17, 18); + file = line.mid(36); + + size = size.replace("(", "").replace(")", "").replace(QChar(0xA0), "").replace(" ", "").replace(".", ""); + + QDateTime dateTime = QDateTime(QDate::fromString(date, "dd.MM.yyyy"), QTime::fromString(time, "hh:mm")); + + add(curDir, file, dateTime, size.toLongLong(), false); +} + +bool cFileList::load(const QString& file) +{ + clear(); + + QFile inFile(file); + + if(!inFile.open(QIODevice::ReadOnly)) + return(false); + + + QTextStream in(&inFile); + + QString curDir = ""; + + while(!in.atEnd()) + { + QString line = in.readLine(); + + 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("")) + continue; + else if(line.left(14) == " Directory of ") + curDir = line.mid(14); + else + parseLine(curDir, line); + } + + inFile.close(); + + 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++) + { + cFile* lpFile = *i; + if(lpFile->compare(dir, file, dateTime, size)) + return(lpFile); + } + return(nullptr); +} diff --git a/cfile.h b/cfile.h new file mode 100644 index 0000000..78cb665 --- /dev/null +++ b/cfile.h @@ -0,0 +1,45 @@ +#ifndef CFILE_H +#define CFILE_H + + +#include +#include +#include +#include +#include + + +class cFile : public QObject +{ + Q_OBJECT +public: + explicit cFile(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size, QObject *parent = nullptr); + virtual ~cFile(); + + bool compare(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size); + + QString dir(); + QString file(); + QDateTime dateTime(); + qint64 size(); +private: + QString m_dir; + QString m_file; + QDateTime m_dateTime; + qint64 m_size; +}; + +Q_DECLARE_METATYPE(cFile*) + +class cFileList : public QList +{ +public: + bool load(const QString& file); + cFile* add(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size, bool search = true); + cFile* find(const QString& dir, const QString& file, const QDateTime& dateTime, const qint64& size); + +private: + void parseLine(const QString& curDir, const QString& line); +}; + +#endif // CFILE_H diff --git a/cmainwindow.cpp b/cmainwindow.cpp index e359b60..f974417 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -2,11 +2,31 @@ #include "ui_cmainwindow.h" +bool fileSort(cFile* file1, cFile* file2) +{ + if(file1->dir().compare(file2->dir(), Qt::CaseInsensitive) < 0) + return(true); + if(file1->file().compare(file2->file(), Qt::CaseInsensitive) < 0) + return(true); + if(file1->dateTime() < file2->dateTime()) + return(true); + if(file1->size() < file2->size()) + return(true); + + return(false); +} + cMainWindow::cMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::cMainWindow) { ui->setupUi(this); + + m_lpLeftListModel = new QStandardItemModel(0, 1); + ui->m_lpLeftList->setModel(m_lpLeftListModel); + + m_lpRightListModel = new QStandardItemModel(0, 1); + ui->m_lpRightList->setModel(m_lpRightListModel); } cMainWindow::~cMainWindow() @@ -14,10 +34,38 @@ cMainWindow::~cMainWindow() delete ui; } -void cMainWindow::on_m_lpLoadListFromFileLeft_triggered(QAction *arg1) +void cMainWindow::on_m_lpLoadListFromFileLeft_clicked() { + m_listLeft.load("C:\\Users\\VET0572\\Documents\\github\\build-dir2csv-Desktop_Qt_5_13_0_MinGW_64_bit-Release\\deploy\\photos.txt"); +// std::sort(m_listLeft.begin(), m_listRight.end(), fileSort); + displayList(m_lpLeftListModel, m_listLeft); } -void cMainWindow::on_m_lpLoadListFromFileRight_triggered(QAction *arg1) +void cMainWindow::on_m_lpLoadListFromFileRight_clicked() { + m_listRight.load("C:\\Users\\VET0572\\Documents\\github\\build-dir2csv-Desktop_Qt_5_13_0_MinGW_64_bit-Release\\deploy\\photos1.txt"); +// std::sort(m_listRight.begin(), m_listRight.end(), fileSort); + displayList(m_lpRightListModel, m_listRight); +} + +void cMainWindow::displayList(QStandardItemModel* lpModel, cFileList& fileList) +{ + lpModel->clear(); + + QStringList header; + header << "directory" << "file" << "date/time" << "size"; + lpModel->setHorizontalHeaderLabels(header); + + for(cFileList::iterator i = fileList.begin();i != fileList.end();i++) + { + QList items; + cFile* lpFile = *i; + + items.append(new QStandardItem(lpFile->dir())); + items.append(new QStandardItem(lpFile->file())); + items.append(new QStandardItem(lpFile->dateTime().toString())); + items.append(new QStandardItem(QString::number(lpFile->size()))); + + lpModel->appendRow(items); + } } diff --git a/cmainwindow.h b/cmainwindow.h index e0bb88b..c3c0d39 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -1,7 +1,13 @@ #ifndef CMAINWINDOW_H #define CMAINWINDOW_H + +#include "cfile.h" + #include +#include +#include + namespace Ui { class cMainWindow; @@ -16,12 +22,17 @@ public: ~cMainWindow(); private slots: - void on_m_lpLoadListFromFileLeft_triggered(QAction *arg1); - - void on_m_lpLoadListFromFileRight_triggered(QAction *arg1); + void on_m_lpLoadListFromFileLeft_clicked(); + void on_m_lpLoadListFromFileRight_clicked(); private: - Ui::cMainWindow *ui; + Ui::cMainWindow* ui; + QStandardItemModel* m_lpLeftListModel; + QStandardItemModel* m_lpRightListModel; + cFileList m_listLeft; + cFileList m_listRight; + + void displayList(QStandardItemModel* lpModel, cFileList& fileList); }; #endif // CMAINWINDOW_H diff --git a/compareDir.pro b/compareDir.pro index e2fdec7..1aab9ef 100644 --- a/compareDir.pro +++ b/compareDir.pro @@ -25,10 +25,12 @@ DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ + cfile.cpp \ main.cpp \ cmainwindow.cpp HEADERS += \ + cfile.h \ cmainwindow.h FORMS += \