家裝業(yè)務(wù)員怎么做網(wǎng)站營(yíng)銷網(wǎng)絡(luò)廣告有哪些形式

第三代軟件開發(fā)-文件監(jiān)視器
文章目錄
- 第三代軟件開發(fā)-文件監(jiān)視器
- 項(xiàng)目介紹
- 文件監(jiān)視器
- 實(shí)現(xiàn)原理
- 關(guān)于 QFileSystemWatcher
- 實(shí)現(xiàn)代碼
關(guān)鍵字:
Qt
、
Qml
、
關(guān)鍵字3
、
關(guān)鍵字4
、
關(guān)鍵字5
項(xiàng)目介紹
歡迎來(lái)到我們的 QML & C++ 項(xiàng)目!這個(gè)項(xiàng)目結(jié)合了 QML(Qt Meta-Object Language)和 C++ 的強(qiáng)大功能,旨在開發(fā)出色的用戶界面和高性能的后端邏輯。
在項(xiàng)目中,我們利用 QML 的聲明式語(yǔ)法和可視化設(shè)計(jì)能力創(chuàng)建出現(xiàn)代化的用戶界面。通過(guò)直觀的編碼和可重用的組件,我們能夠迅速開發(fā)出豐富多樣的界面效果和動(dòng)畫效果。同時(shí),我們利用 QML 強(qiáng)大的集成能力,輕松將 C++ 的底層邏輯和數(shù)據(jù)模型集成到前端界面中。
在后端方面,我們使用 C++ 編寫高性能的算法、數(shù)據(jù)處理和計(jì)算邏輯。C++ 是一種強(qiáng)大的編程語(yǔ)言,能夠提供卓越的性能和可擴(kuò)展性。我們的團(tuán)隊(duì)致力于優(yōu)化代碼,減少資源消耗,以確保我們的項(xiàng)目在各種平臺(tái)和設(shè)備上都能夠高效運(yùn)行。
無(wú)論您是對(duì) QML 和 C++ 開發(fā)感興趣,還是需要我們?yōu)槟鷺?gòu)建復(fù)雜的用戶界面和后端邏輯,我們都隨時(shí)準(zhǔn)備為您提供支持。請(qǐng)隨時(shí)聯(lián)系我們,讓我們一同打造現(xiàn)代化、高性能的 QML & C++ 項(xiàng)目!
重要說(shuō)明?
?該專欄在第三代軟開發(fā)更新完將漲價(jià)
文件監(jiān)視器
如果你看過(guò)我前面【第三代軟件開發(fā)-U盤監(jiān)測(cè)】的話,在哪里會(huì)發(fā)現(xiàn)有一個(gè)文件監(jiān)視器,指的就是這個(gè)模塊
實(shí)現(xiàn)原理
如下圖所示,其實(shí)就是在Qt的文件監(jiān)視器基礎(chǔ)上做了細(xì)分,支持之別是文件增加、減少和重命名。
關(guān)于 QFileSystemWatcher
QFileSystemWatcher是一個(gè)用于監(jiān)視文件和目錄變化的類。它是Qt框架中的一部分,用于跟蹤文件系統(tǒng)中的文件和目錄的變化,例如文件的創(chuàng)建、修改、刪除以及目錄的重命名等操作。
使用QFileSystemWatcher,您可以注冊(cè)要監(jiān)視的文件或目錄,并在這些文件或目錄發(fā)生變化時(shí)接收通知。它提供了一種方便的方式來(lái)監(jiān)視文件系統(tǒng)的變化,以便及時(shí)響應(yīng)這些變化。
QFileSystemWatcher可以用于許多不同的應(yīng)用場(chǎng)景,例如:
自動(dòng)更新:您可以使用QFileSystemWatcher來(lái)監(jiān)視特定文件或目錄的變化,并在文件或目錄發(fā)生更改時(shí)自動(dòng)觸發(fā)更新操作。
日志記錄:如果您需要監(jiān)視日志文件的變化,您可以使用QFileSystemWatcher來(lái)實(shí)時(shí)檢測(cè)文件的更新,并在文件發(fā)生變化時(shí)記錄相關(guān)信息。
文件同步:如果您正在開發(fā)一個(gè)文件同步應(yīng)用程序,您可以使用QFileSystemWatcher來(lái)監(jiān)視源文件夾中的變化,并在文件發(fā)生更改時(shí)自動(dòng)同步到目標(biāo)文件夾。
使用QFileSystemWatcher非常簡(jiǎn)單。您只需創(chuàng)建一個(gè)QFileSystemWatcher對(duì)象,然后使用addPath()方法注冊(cè)要監(jiān)視的文件或目錄的路徑。當(dāng)所監(jiān)視的文件或目錄發(fā)生變化時(shí),QFileSystemWatcher會(huì)發(fā)出directoryChanged()或fileChanged()信號(hào),您可以連接這些信號(hào)來(lái)處理相應(yīng)的變化。
需要注意的是,QFileSystemWatcher的可用性取決于操作系統(tǒng)的支持。在某些操作系統(tǒng)上,QFileSystemWatcher可能無(wú)法監(jiān)視某些特定的文件或目錄變化。因此,在使用QFileSystemWatcher時(shí),建議仔細(xì)查閱相關(guān)文檔以了解其在目標(biāo)平臺(tái)上的限制和行為。
實(shí)現(xiàn)代碼
代碼基本不怎么復(fù)雜,直接上代碼吧
#include <QObject>
#include <QDebug>#include <QMap>
#include <QFileSystemWatcher>
#include <QFileInfo>
#include <QDir>class XXXX : public QObject
{Q_OBJECT
public:explicit XXXX(QObject *parent = nullptr);void addWatchPath(QString path);void removeWatchPath(QString path);void getInitFile(QString path);public slots:void slotDirectoryUpdated(const QString &path); // 目錄更新時(shí)調(diào)用,path是監(jiān)控的路徑void slotFileUpdated(const QString &path); // 文件被修改時(shí)調(diào)用,path是監(jiān)控的路徑signals:// 添加新文件/目錄至Dirvoid signalAddFile(QString strFolder, QString strFile);// 從Dir中刪除文件/目錄void signalDeleteFile(QString strFolder, QString strFile);// 文件/目錄重命名void signalRenamedFile(QString strFolder, QString strNewName, QString strOldName);private:
// static XXXX *m_pInstance; // 單例QFileSystemWatcher* m_pSystemWatcher = nullptr; // QFileSystemWatcher變量QMap<QString, QStringList> m_currentContentsMap; // 當(dāng)前每個(gè)監(jiān)控的內(nèi)容目錄列表};#endif // XXXX_H
#include "XXXX.h"
/*** @brief XXXX::XXXX* @param parent* 構(gòu)造函數(shù)*/
XXXX::XXXX(QObject *parent) : QObject(parent)
{m_pSystemWatcher = new QFileSystemWatcher;// 連接QFileSystemWatcher的directoryChanged和fileChanged信號(hào)到相應(yīng)的槽connect(m_pSystemWatcher,&QFileSystemWatcher::directoryChanged,this,&XXXX::slotDirectoryUpdated);connect(m_pSystemWatcher,&QFileSystemWatcher::fileChanged,this,&XXXX::slotFileUpdated);
}
/*** @brief XXXX::addWatchPath* @param path* 添加監(jiān)控路徑*/
void XXXX::addWatchPath(QString path)
{// 添加監(jiān)控路徑m_pSystemWatcher->addPath(path);// 如果添加路徑是一個(gè)目錄,保存當(dāng)前內(nèi)容列表QFileInfo file(path);if (file.isDir()){QDir dirw(path);m_currentContentsMap[path] = dirw.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);}
}
/*** @brief XXXX::removeWatchPath* @param path* 移除監(jiān)控路徑*/
void XXXX::removeWatchPath(QString path)
{m_pSystemWatcher->removePath(path);
}
/*** @brief XXXX::getInitFile* @param path* 獲取初始文件*/
void XXXX::getInitFile(QString path)
{}
/*** @brief XXXX::slotDirectoryUpdated* @param path* 目錄更新槽函數(shù)*/
void XXXX::slotDirectoryUpdated(const QString &path)
{// 比較最新的內(nèi)容和保存的內(nèi)容找出區(qū)別(變化)QStringList currEntryList = m_currentContentsMap[path];const QDir dir(path);QStringList newEntryList = dir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs | QDir::Files, QDir::DirsFirst);QSet<QString> newDirSet = QSet<QString>::fromList(newEntryList);QSet<QString> currentDirSet = QSet<QString>::fromList(currEntryList);// 添加了文件QSet<QString> newFiles = newDirSet - currentDirSet;QStringList newFile = newFiles.toList();// 文件已被移除QSet<QString> deletedFiles = currentDirSet - newDirSet;QStringList deleteFile = deletedFiles.toList();// 更新當(dāng)前設(shè)置m_currentContentsMap[path] = newEntryList;if (!newFile.isEmpty() && !deleteFile.isEmpty()){// 文件/目錄重命名if ((newFile.count() == 1) && (deleteFile.count() == 1)){emit signalRenamedFile(path,newFile.first(),deleteFile.first());}}else{// 添加新文件/目錄至Dirif (!newFile.isEmpty()){foreach (QString file, newFile){qDebug() << "新增文件路徑:" << file;// 處理操作每個(gè)新文件....emit signalAddFile(path,file);}}// 從Dir中刪除文件/目錄if (!deleteFile.isEmpty()){foreach(QString file, deleteFile){// 處理操作每個(gè)被刪除的文件....emit signalDeleteFile(path,file);}}}}
/*** @brief XXXX::slotFileUpdated* @param path* 文件更新*/
void XXXX::slotFileUpdated(const QString &path)
{QFileInfo file(path);QString strPath = file.absolutePath();QString strName = file.fileName();// qDebug() << QString("The file %1 at path %2 is updated").arg(strName).arg(strPath);}
真的很簡(jiǎn)單,不用解釋過(guò)多吧。這個(gè)不是我的原創(chuàng),是我們公司小伙伴寫的,我的智商能理解,我就認(rèn)為你也理解,因?yàn)槲液臀倚』锇檎f(shuō)要把我當(dāng)成傻逼才行。
