クライアントのコンピューター (およびその他のマウントされたドライブ) でイメージを検索する最速の方法は何ですか。私のクライアントには Python のデスクトップ アプリがインストールされていますが、C++ コードを追加した方が速い場合は追加できます...
2 に答える
プラットフォームが Win32 の場合、C++ を使用すると、Winapi 関数を簡単に使用できます。
その後
ファイル名として、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());
}
}
の場合、モジュールpython
の組み込み機能を使用するだけos
で、適切なクロスプラットフォーム ソリューションになります。については、 boost filesystemC++
を使用することをお勧めします。これは、最も苦痛の少ない解決策です。
速度に関しては、まあ、問題ないでしょう。このような関数は、完全に I/O バウンドになります。理論的にはこれをスレッド化できますが、同じドライブ上にある場合でも、I/O バウンドになります。別のドライブにある場合は、最適化する前に通常どおりプロファイルを行いますが、速度が向上する可能性があります。