3

搜索客户计算机(和其他安装的驱动器)的最快方法是什么?我的客户将安装一个使用 Python 编写的桌面应用程序,但如果速度更快,我可以添加 C++ 代码......

4

2 回答 2

3

如果您的平台是 Win32,使用 C++,您可以简单地使用 Winapi 函数

查找第一个文件

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模块中的内置功能将是一个足够的跨平台解决方案。对于C++,我建议使用boost filesystem,这将是迄今为止最不痛苦的解决方案。

至于速度,好吧,这可能无关紧要。此类函数将完全受 I/O 限制。理论上你可以线程化它,但如果它在同一个驱动器上,它仍然是 I/O 绑定的。如果它在单独的驱动器上,它可能会给你一些加速,但像往常一样,在优化之前进行配置。

于 2013-04-05T06:17:32.643 回答