3 Stimmen

Suche auf dem Computer des Kunden nach bestimmten Dateien

Was ist der schnellste Weg, um den Computer des Kunden (und andere verbundene Laufwerke) nach Bildern zu durchsuchen? Meine Kunden werden eine Desktop-Anwendung installiert haben, die in Python ist, aber ich kann C++-Code hinzufügen, wenn das schneller ist...

3voto

accfews Punkte 1980

Wenn Ihre Plattform Win32 ist, können Sie einfach Winapi-Funktionen mit C++ verwenden

FindFirstFile

FindFirstFileEx

und dann

FindNextFile

Als Dateiname können Sie Platzhalter für bekannte Bildformate wie jpg, jpeg, png, bmp usw. verwenden.

Wenn Sie zusätzliche Geschwindigkeit wünschen, können Sie Funktionen auf verschiedenen Threads ausführen und dann die Ergebnisse synchronisieren.

Bearbeitung:

Für eine plattformunabhängige Lösung können Sie die boost::filesystem-Klasse oder Qt's QDir verwenden

Beispielscode zum rekursiven Suchen von Dateien mit boost::filesystem

std::string target_path( "C:\\" );
boost::regex my_filter( "*\.bmp" );
std::vector< std::string > all_matching_files;
for ( boost::filesystem::recursive_directory_iterator end, dir(target_path); 
    dir != end; ++dir ) 
{
    // Überspringen, wenn keine Datei
    if( !boost::filesystem::is_regular_file( i->status() ) ) 
        continue;
    boost::smatch what;

    // Überspringen, wenn keine Übereinstimmung
    if( !boost::regex_match( i->leaf(), what, my_filter ) ) continue;

    // Datei passt, speichern
    all_matching_files.push_back( i->leaf() );                                 
}

Für eine bessere Implementierung empfehle ich Ihnen dringend, die boost::filesystem-Dokumentation zu lesen

Für das QDir-Beispiel

filesStack = new QStack();

QDir selectedDir("C:\\");
selectedDir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDot | QDir::NoDotDot);
QStringList qsl; qsl.append("*.bmp");
selectedDir.setNameFilters(qsl);
findFilesRecursively(selectedDir);

void findFilesRecursively(QDir rootDir) 
{
    QDirIterator it(rootDir, QDirIterator::Subdirectories);
    while(it.hasNext()) 
    {
        filesStack->push(it.next());
    }
}

2voto

Yuushi Punkte 24524

Für Python wird es ausreichen, einfach die eingebaute Funktionalität des os-Moduls zu verwenden, um eine plattformübergreifende Lösung zu erhalten. Für C++ würde ich empfehlen, Boost Dateisystem zu verwenden, was mit Abstand die schmerzloseste Lösung sein wird.

Was die Geschwindigkeit betrifft, nun, wahrscheinlich wird es keine Rolle spielen. Solche Funktionen werden komplett von Ein- und Ausgaben abhängig sein. Theoretisch könnten Sie das in Threads auslagern, aber wenn es auf der gleichen Festplatte ist, wird es immer noch von Ein- und Ausgaben abhängig sein. Wenn es auf separaten Festplatten ist, könnte es Ihnen eine gewisse Beschleunigung bringen, obwohl, wie üblich, vor der Optimierung profilieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X