2017-06-15 104 views
1

我想通過兩個不同的目錄迭代。這兩個目錄位於相同的根目錄/如何遍歷QStringList

void MainWindow::loadPlugins() 
{ 
    pluginsDir = QDir(qApp -> applicationDirPath()); 

#if defined(Q_OS_WIN) 
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") 
     pluginsDir.cdUp(); 
#elif defined(Q_OS_MAC) 
    if (pluginsDir.dirName() == "MacOS") { 
     pluginsDir.cdUp(); 
     pluginsDir.cdUp(); 
     pluginsDir.cdUp(); 
    } 
#endif 

    QStringList dirs; 
    dirs << "plugins" << "core_plugs"; 

    QList<QObject *> loadedPlugs; 

    for (int i = 0; i < dirs.size(); ++i) 
    { 
     cout << dirs.at(i).toLocal8Bit().constData() << endl; 

     pluginsDir.cd(dirs.at(i).toLocal8Bit().constData()); 

     foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { 
      QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); 
      QObject *plugin = loader.instance(); 
      qDebug() << "NAME :: " << fileName; 
      if (plugin && !(loadedPlugs . contains(plugin))) { 
       loadedPlugs << plugin; 
       dirs . removeAt(i); 
      } else { 
       continue; 
      } 
     } 
    } 
} 

我只能夠進入的第一個目錄插件列表dirs << "plugins" << "core_plugs";。重新訂購dirs << "core_plugs" << "plugins";後,結果相同,只解析了第一個目錄core_plugs

爲什麼我得到這種行爲,以及如何通過這兩個目錄進行迭代。

UPDATE

void MainWindow::loadPlugins() 
{ 
    pluginsDir = QDir(qApp -> applicationDirPath()); 

#if defined(Q_OS_WIN) 
    if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") 
     pluginsDir.cdUp(); 
#elif defined(Q_OS_MAC) 
    if (pluginsDir.dirName() == "MacOS") { 
     pluginsDir.cdUp(); 
     pluginsDir.cdUp(); 
     pluginsDir.cdUp(); 
    } 
#endif 

    QStringList dirs; 
    dirs << "plugins" << "core_plugs"; 

    QList<QObject *> loadedPlugs; 

    for (int i = 0; i < dirs.size(); ++i) 
    { 
     pluginsDir.cd(dirs.at(i).toLocal8Bit().constData()); 

     foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { 
      QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); 
      QObject *plugin = loader.instance(); 
      if (plugin && !(loadedPlugs . contains(plugin))) { 
       populateRevPlugins(plugin); 
       loadedPlugs << plugin; 
      } 
     } 
     qDebug() << pluginsDir . absolutePath(); 
     pluginsDir.cdUp(); 
     qDebug() << pluginsDir . absolutePath(); 
    } 
} 

繼@ Azeem的建議,我更新了我的企圖,如上圖所示。我試圖cdUp();foreach即後:

foreach() {} pluginsDir.cdUp();` 

,但它不被逮住。那裏太晚了。比這更快,我得到的迭代太少。你能否建議我可以特別關注它?

謝謝你的迴應。

+0

爲什麼這麼晚?而且,「它不會被抓到」是什麼意思? – Azeem

+0

我無法迭代到第二個目錄。 'pluginsDir.cdUp();'工作,並且目錄改變,但第二個目錄沒有迭代。在迭代結束後,似乎會發生'cdUp'。 –

+1

下面是你的代碼的精簡版:http://ideone.com/H3qY81,它工作正常!你需要檢查'cd'是否有錯誤處理。 – Azeem

回答

2

這裏是如何通過一個QStringList中使用C++ 11的範圍,爲循環迭代:

QStringList list { "A", "B", "C" }; 

for (const auto& i : list ) 
{ 
    qDebug() << i; 
} 

但是,我相信,你的問題不是迭代。你的問題是你是cd進入一個目錄,但沒有離開它,即cd("..")cdUp()

正如你所說,這兩個目錄是在相同的路徑,即根/。 因此,在嵌套循環中處理之後,您需要返回根路徑以訪問其他目錄。

您可以簡單地檢查cd函數的結果是否成功。它是一個布爾函數。但是,在你的情況下,錯誤處理丟失。有了錯誤處理,應該是這樣的:

if (dir.cd(path)) 
{ 
    // Process here... 
} 

你沒有得到dirs.at(i).toLocal8Bit().constData()的CD功能。它需要QString

cd簽名:bool QDir::cd(const QString &dirName)

提示: 您還可以使用QDirIterator用於重複整個目錄。

下面是一個完整的工作示例。

我下面的目錄結構進行一下測試:

C:\Test 
-- A 
---- a.txt 
-- B 
---- b.txt 

例子:

#include <QStringList> 
#include <QDebug> 
#include <QDir> 

int main(int argc, char *argv[]) 
{ 
    Q_UNUSED(argc); 
    Q_UNUSED(argv); 

    const QString  root { "C:/Test" }; 
    const QStringList dirs { "A", "B" }; 

    QDir rootDir { root }; 
    qDebug() << "Root Path:" << rootDir.absolutePath(); 
    qDebug() << "Root List:" << rootDir.entryList(QDir::Dirs) << '\n'; 

    for (const auto& dir : dirs ) 
    { 
     if (rootDir.cd(dir)) 
     { 
      qDebug() << "Dir Path:" << rootDir.absolutePath(); 
      qDebug() << "Dir List:" << rootDir.entryList(QDir::Files) << '\n'; 
     } 

     rootDir.cdUp(); 
     qDebug() << "cding..."; 
     qDebug() << "Dir Path:" << rootDir.absolutePath() << '\n'; 
    } 

    return EXIT_SUCCESS; 
} 

下面是輸出:

enter image description here

+0

Hi @Azeem。我想在'foreach後'cdUp();':foreach(){} pluginsDir.cdUp();',但它不會被捕獲。那裏太晚了。比這更快,我得到的迭代太少。你能否建議我可以特別關注它?感謝您的答覆。 –

+1

@程序-Me-Rev:您好!你能更新你的代碼嗎?順便說一句,你不需要那個'else {continue; }'在嵌套循環的末尾。當'if'條件不成立時我會重申,我相信你的意圖也是一樣的。 – Azeem

+1

@ Program-Me-Rev:你可以簡單地創建完全合格的路徑,而'cd'像這樣:'pluginsDir.cd(「/」+ dir.at(i));'那就做到了。而且,循環後你不需要'cdUp()'。 :) – Azeem