簡體   English   中英

QT與SQLite數據庫同步文件的最佳方法

[英]qt the best way to sync files with a sqlite db

我正在尋找與sqlite db同步某些目錄中文件的最佳方法。

首先,我使用一個線程來遞歸查找按擴展名篩選的文件,並將其添加到我的數據庫中。 接下來,我使用QFileSystemWatcher來監視文件是否更改並且運行良好。

問題是每次我運行應用程序時,我都不知道文件是否已更改,因此我需要運行線程,並且在執行過程中(大約1分鍾)占用一個內核的100%cpu

那我該怎么做才能改善這個算法呢? 謝謝

關於A993

編輯:

該代碼是遞歸函數,類似於此函數,我用於對目錄中的文件進行計數(此函數也占用100%的cpu)

int MediaScan_Thread::recursiveCount(QDir &dir)
{
    int i=dir.entryInfoList(_filters,QDir::Files).count();
    foreach(QFileInfo info, dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot))
     {
         QDir subdir(info.absoluteFilePath());
         i += recursiveCount(subdir);
     }

    return i;
}

我正在Linux上工作,但我會開發一個多平台應用程序。

我將遍歷一個entryList()列表,遞歸目錄並檢查文件上的文件過濾器。 沒有一種簡單的方法可以在多個線程上遞歸搜索文件列表。 但是,一旦獲得文件列表,對其進行並行處理應該很容易。

我將對count和文件列表的調用組合到了I / O上,因為沒有理由重復兩次。 此版本將跟蹤查詢的QStringList ,以便以后可以進行更多處理。

在創建遞歸函數列表時,在遞歸函數上使用foreach可能會出現問題,因此我改用帶迭代器的for循環。

特殊的添加是模仿QDir nameFilters功能,因為entryList()帶有用於目錄和文件(不是我們想要的)的fileFilters參數。

我省略的一個功能是遞歸深度限制,以避免永遠搜索。

此代碼示例已編譯但未經測試

    // declare in MediaScan_Thread and set them in constructor or wherever it needs to be:
    QVector<QRegExp>    _nameRegExps;
    QStringList         _filters;
    QDir::Filters       _dirFilters;

    // ....

    void    MediaScan_Thread::initFilterRegExp()
    {
        _nameRegExps.clear();
        for (int i = 0; i < _filters.size(); ++i)
        {
            _nameRegExps.append( QRegExp(_filters.at(i), (_dirFilters & QDir::CaseSensitive) ? Qt::CaseSensitive : Qt::CaseInsensitive, QRegExp::Wildcard) );
        }
    }

    int MediaScan_Thread::recursiveCountAndMatchedFiles(QDir &dir, QStringList& matchedFiles )
    {
        int i = 0;
        QFileInfoList   lst = dir.entryInfoList( QStringList() , QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot );

        for ( auto itr = lst.begin(); itr != lst.end(); itr++ )
        {
            QFileInfo &info = (*itr);

            if (info.isDir())
                i += recursiveCountAndMatchedFiles( info.absoluteDir(), matchedFiles );
            else
            {
                QString fileName = info.absoluteFilePath();
                for (auto iter = _nameRegExps.constBegin(), end = _nameRegExps.constEnd();
                    iter != end; ++iter)
                {
                    if (iter->exactMatch(fileName)) {
                        i++;
                        matchedFiles << fileName;
                        break;
                    }
                }
            }
        }

        return i;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM