2017-06-15 3452 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