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...
Antworten
Zu viele Anzeigen?Wenn Ihre Plattform Win32 ist, können Sie einfach Winapi-Funktionen mit C++ verwenden
und dann
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());
}
}
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.