3

クライアントのコンピューター (およびその他のマウントされたドライブ) でイメージを検索する最速の方法は何ですか。私のクライアントには Python のデスクトップ アプリがインストールされていますが、C++ コードを追加した方が速い場合は追加できます...

4

2 に答える 2

3

プラットフォームが Win32 の場合、C++ を使用すると、Winapi 関数を簡単に使用できます。

FindFirstFile

FindFirstFileEx

その後

次のファイルを検索

ファイル名として、jpg、jpeg、png、bmp などの既知の画像形式のワイルドカードを指定できます。

さらに速度が必要な場合は、異なるスレッドで関数を実行し、結果を同期できます。

編集:

プラットフォームに依存しないソリューションの場合は、 boost::filesystemクラスまたは Qt の QDirを使用できます

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 ) 
{
    // Skip if not a file
    if( !boost::filesystem::is_regular_file( i->status() ) ) 
        continue;
    boost::smatch what;

    // Skip if no match
    if( !boost::regex_match( i->leaf(), what, my_filter ) ) continue;

    // File matches, store it
    all_matching_files.push_back( i->leaf() );                                 
}

より良い実装のために、 boost::filesystemのドキュメントを読むことを強くお勧めします

QDir の例の場合

filesStack = new QStack<QString>();

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());
    }
}
于 2013-04-05T05:57:13.887 に答える
2

の場合、モジュールpythonの組み込み機能を使用するだけosで、適切なクロスプラットフォーム ソリューションになります。については、 boost filesystemC++を使用することをお勧めします。これは、最も苦痛の少ない解決策です。

速度に関しては、まあ、問題ないでしょう。このような関数は、完全に I/O バウンドになります。理論的にはこれをスレッド化できますが、同じドライブ上にある場合でも、I/O バウンドになります。別のドライブにある場合は、最適化する前に通常どおりプロファイルを行いますが、速度が向上する可能性があります。

于 2013-04-05T06:17:32.643 に答える