在客户端的计算机上搜索特定文件

时间:2013-04-05 05:49:58

标签: c++ python search desktop-application

搜索客户端计算机(和其他已安装的驱动器)的最快方式是图像。我的客户将安装一个使用Python的桌面应用程序,但如果更快,我可以添加C ++代码......

2 个答案:

答案 0 :(得分:3)

如果您的平台是Win32,使用C ++,您只需使用Winapi功能

FindFirstFile

FindFirstFileEx

然后

FindNextFile

作为文件名,您可以为已知的图像格式(如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());
    }
}

答案 1 :(得分:2)

对于python,仅使用os模块中的内置功能将是一个适当的跨平台解决方案。对于C++,我建议使用boost filesystem,这是迄今为止最不痛苦的解决方案。

至于速度,嗯,这可能无关紧要。这些函数将完全受I / O限制。你理论上可以解决这个问题,但是如果它在同一个驱动器上,它仍然是I / O绑定的。如果它位于不同的驱动器上,它可能会为您提供一些加速,但通常情况下,优化前的配置文件。