2011-11-08 8 views
32

में एक निर्देशिका में इसकी सभी फ़ाइलों और इसके उपनिर्देशिकाओं पर दोबारा दोबारा दोहराएं, मैं एक दिए गए एक्सटेंशन के साथ फ़ाइलों के लिए एक निर्देशिका और इसकी सभी उप-निर्देशिकाओं को रिकर्स करना चाहता हूं - उदाहरण के लिए, सभी * .jpg फ़ाइलें। आप क्यूटी में ऐसा कैसे कर सकते हैं?कर्ट

+1

इसके अलावा, क्यूटी में एक QFileSystemModel ऑब्जेक्ट है जिसे आप – Chris

उत्तर

67

मुझे समस्या है कि आप QDirIterator पर एक नज़र डालें।

QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories); 
while (it.hasNext()) 
    qDebug() << it.next(); 

इससे एल्गोरिदम अधिक स्केलेबल बनाता है। QDir::entryList() एक ही निर्देशिका में कई फ़ाइलों को संग्रहीत करते समय अचानक बड़ी मात्रा में स्मृति ले सकता है। छोटे एम्बेडेड उपकरणों पर अच्छा नहीं है।

+6

मैंने आधिकारिक दस्तावेज़ों को ठीक से नहीं पढ़ने के कारण बहुत समय बर्बाद कर दिया। कृपया ध्यान दें "निर्माण के बाद, इटेटरेटर पहली निर्देशिका प्रविष्टि से पहले स्थित है। 'अगला()' फ़ंक्शन अगली निर्देशिका प्रविष्टि का मार्ग लौटाता है और इसे पुनरावृत्त करता है।" तो फाइलों से संबंधित आपका कोड 'it.next()' के बाद आना चाहिए। –

5

यह काम करना चाहिए:

void scanDir(QDir dir) 
{ 
    dir.setNameFilters(QStringList("*.nut")); 
    dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks); 

    qDebug() << "Scanning: " << dir.path(); 

    QStringList fileList = dir.entryList(); 
    for (int i=0; i<fileList.count(); i++) 
    { 
     if(fileList[i] != "main.nut" && 
      fileList[i] != "info.nut") 
     { 
      qDebug() << "Found file: " << fileList[i]; 
     } 
    } 

    dir.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); 
    QStringList dirList = dir.entryList(); 
    for (int i=0; i<dirList.size(); ++i) 
    { 
     QString newPath = QString("%1/%2").arg(dir.absolutePath()).arg(dirList.at(i)); 
     scanDir(QDir(newPath)); 
    } 
} 

अपने कोड से मतभेद के बाद कर रहे हैं:

बजाय गहराई पहले खोज की
  • चौड़ाई पहले खोज (इसके लिए कोई कारण नहीं है, मैं सिर्फ यह पसंद करते हैं)
  • sym लिंक
  • EntryInfoList के बजाय EntryList से बचने के लिए अधिक फ़िल्टर। अगर आपको सिर्फ फाइल का नाम चाहिए तो आपको इसकी आवश्यकता नहीं है।

मैं इसे परीक्षण किया है और इसे सही ढंग से काम करता है, लेकिन सूचना के निम्नलिखित:

  • यह बहुत समय लग सकता है, इसलिए धागे से यह चलाने पर विचार
  • अगर वहाँ गहरी प्रत्यावर्तन है आप हो सकता है आपके स्टैक
+0

पर विचार करना चाहेंगे जब तक कि मुझे कुछ याद नहीं आ रहा है, तो आपने उसके फ़ंक्शन का आउटपुट बदल दिया। वह दी गई निर्देशिका में सभी फाइलों की सूची चाहता है, जबकि आपका फ़ंक्शन केवल फ़ाइल नाम प्रिंट करेगा लेकिन सूची प्रदान नहीं करेगा। –

+0

वह 'nutfiles' स्ट्रिंग सूची भर नहीं रहा था, इसलिए मैंने इस भाग को शामिल नहीं किया था। फ़ंक्शन को संशोधित करने और सभी फ़ाइलों की सूची प्राप्त करने के लिए यह बहुत आसान है – pnezis

3

मैंने QDirIterator का उपयोग किया।

// used to store the file paths 
filesStack = new QStack<QString>(); 

// I use a file dialog to let the user choose the root folder to search in 
if (fileDialog->exec() == QFileDialog::Accepted) { 
    QDir selectedDir(fileDialog->selectedFiles().first()); 
    selectedDir.setFilter(QDir::Files | 
          QDir::Dirs | QDir::NoDot | QDir::NoDotDot); 
    QStringList qsl; qsl.append("*.xml"); // I only want XML files 
    selectedDir.setNameFilters(qsl); 
    findFilesRecursively(selectedDir); 
} 

// this function stores the absolute paths of each file in a QVector 
void findFilesRecursively(QDir rootDir) { 
    QDirIterator it(rootDir, QDirIterator::Subdirectories); 
    while(it.hasNext()) { 
     filesStack->push(it.next()); 
    } 
} 

संकेत के लिए हर किसी के लिए धन्यवाद:

यहाँ कैसे मैं यह कर और कितना आसान सभी XML पूर्ण फ़ाइल पथ रिकर्सिवली बहुत तेजी से (Qt4.8.1) को खोजने के लिए था।

संपादित करें: मैंने कुछ घोषणाओं को छोड़ दिया होगा, सावधान रहें।

+0

QDirIterator से प्रदर्शन हिट से सावधान रहें। –

संबंधित मुद्दे

 संबंधित मुद्दे