2017-06-15 9 views
1

Ich versuche, durch zwei verschiedene Verzeichnisse zu iterieren. Die zwei Verzeichnisse befinden sich auf demselben Stamm /.Wie man durch eine QStringList iteriert

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; 
      } 
     } 
    } 
} 

Ich bin nur in der Lage in das erste Verzeichnis in der Liste Plugins dirs << "plugins" << "core_plugs"; zu gehen. Bei einer Neubestellung dirs << "core_plugs" << "plugins"; sind die Ergebnisse identisch, und nur das erste Verzeichnis core_plugs wird geparst.

Warum bekomme ich dieses Verhalten, und wie kann ich es durch beide Verzeichnisse iterieren lassen.

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(); 
    } 
} 

@ Vorschlag der Azeem Folge, ich meinen Versuch aktualisiert, wie oben gezeigt. Ich habe versucht, cdUp(); nach dem foreach dh:

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

aber nicht verfängt. Es ist zu spät dort. Früher als das und ich bekomme zu wenige Wiederholungen. Könnten Sie mir bitte vorschlagen, wie ich das konkret machen kann?

Vielen Dank für die Antwort.

+0

Warum ist es so spät? Und was meinst du mit "es wird nicht erwischt"? – Azeem

+0

Ich kann nicht in das zweite Verzeichnis iterieren. Das 'pluginsDir.cdUp();' funktioniert, und das Verzeichnis ändert sich, aber es findet keine Iteration im zweiten Verzeichnis statt. Es scheint, als ob 'cdUp' nach Ablauf der Iteration passiert. –

+1

Hier ist die abgespeckte Version Ihres Codes: http://ideone.com/H3qY81 und es funktioniert gut! Sie müssen 'cd' für die Fehlerbehandlung überprüfen. – Azeem

Antwort

2

Hier ist, wie Sie durch eine QStringList laufen können C++ 11 Entfernungs-for-Schleife:

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

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

Aber ich glaube, dass das Problem nicht die Iteration ist. Ihr Problem ist, dass Sie cd in einem Verzeichnis sind, aber nicht aus, d. H. cd("..") oder cdUp().

Wie Sie gesagt haben, dass diese beiden Verzeichnisse im selben Pfad sind, d. H. Root /. Nach der Verarbeitung in der verschachtelten Schleife müssen Sie also zurück zum Stammpfad gehen, um auf das andere Verzeichnis zuzugreifen.

Sie können einfach das Ergebnis der cd Funktion überprüfen, ob es erfolgreich war oder nicht. Es ist eine boolesche Funktion. Aber in Ihrem Fall fehlt die Fehlerbehandlung. Mit der Fehlerbehandlung, sollte es so sein:

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

Du hast nicht die dirs.at(i).toLocal8Bit().constData() für die CD-Funktion zu bekommen. Es dauert eine QString.

cd Unterschrift: bool QDir::cd(const QString &dirName)

Tipp: Sie auch QDirIterator zur Iteration ein ganzes Verzeichnis verwenden können.

Hier ist ein voll funktionsfähiges Beispiel.

Ich habe folgende Verzeichnisstruktur für diesen Test:

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

Beispiel:

#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; 
} 

Hier ist die Ausgabe:

enter image description here

+0

Hallo @Azeem. Ich versuche, 'cdUp();' nach der foreach dh: 'foreach() {} pluginsDir.cdUp();', aber es wird nicht gefangen. Es ist zu spät dort. Früher als das und ich bekomme zu wenige Wiederholungen. Könnten Sie mir bitte vorschlagen, wie ich das konkret machen kann? Danke für die Antwort. –

+1

@ Programm-Me-Rev: Hallo! Können Sie Ihren Code bitte aktualisieren? Übrigens brauchst du das nicht 'else {continue; } 'am Ende der verschachtelten Schleife. Es wird wiederholt, wenn die "if" Bedingung nicht wahr ist und ich glaube, dass Ihre Absicht auch die gleiche ist. – Azeem

+1

@ Program-Me-Rev: Sie können einfach den vollqualifizierten Pfad erstellen, während 'cd' so aussieht:' pluginsDir.cd ("/" + dir.at (i)); 'Das wird es tun. Und Sie werden nicht brauchen, dass 'cdUp()' nach der Schleife. :) – Azeem

Verwandte Themen