如何知道并加载特定文件夹中的所有图像?

时间:2010-01-18 21:55:35

标签: c++ windows-xp c++builder

我有一个应用程序(C ++ Builder 6.0)需要知道特定文件夹中的图像总数,然后我必须加载它们:在ImageList或ComboBoxEx ...或任何其他控件中。 ..

我该怎么做?

我知道如何在控件中加载图像,或者保存在TList中,或者在ImageList中...但是如何知道目录中有多少文件文件,以及如何加载其中的每个图像??

我很抱歉我的英语。

5 个答案:

答案 0 :(得分:1)

使用Win32函数FindFirstFile和FindNextFile ......?

答案 1 :(得分:1)

我昨天用C ++使用boost::filesystem库做了类似的事情。但是,如果您尚未使用boost,我强烈建议您只使用Windows库。这是我的代码,如果您有兴趣:

#include <algorithm>
#include <boost/filesystem.hpp>
#include <set>

namespace fs = boost::filesystem;

typedef std::vector<fs::path> PathVector;

std::auto_ptr<PathVector> ImagesInFolder(const fs::path& folderPath) {
    std::set<std::string> targetExtensions;
    targetExtensions.insert(".JPG");
    targetExtensions.insert(".BMP");
    targetExtensions.insert(".GIF");
    targetExtensions.insert(".PNG");

    std::auto_ptr<PathVector> paths(new PathVector());

    fs::directory_iterator end;
    for(fs::directory_iterator iter(folderPath); iter != end; ++iter) {
        if(!fs::is_regular_file(iter->status())) { continue; }

        std::string extension = iter->path().extension();
        std::transform(extension.begin(), extension.end(), extension.begin(), ::toupper);
        if(targetExtensions.find(extension) == targetExtensions.end()) { continue; }

        paths->push_back(iter->path());
    }

    return paths;
}

这不会回答你关于如何将路径实际放入列表框的问题部分。

答案 2 :(得分:0)

没有切实可行的方法来识别任意文件夹中的每个图像。几乎任何你不能认定的东西,都可能是某种形象。然后,再次使用隐写术,甚至你可以识别的东西仍然可能(或包含)至少部分图像。

实际上,您希望选择一组您想要支持的格式,并编写了解它们的代码。出于一些目的,六种格式左右是相当充分的,尽管你选择的确切半打将因应用类型而异 - 例如,只有少数程序可用于位图和矢量图形。

一旦你决定了你想要的东西,DlgDirList可能是列出一些文件最简单的方法。如果对您的目的不够灵活,下一个明显的选择是FindFirstFileFindNextFileFindClose

答案 3 :(得分:0)

要获取文件夹中所有文件的列表,请查看FindFirst中的SysUtils和FindNext函数。

这是一个示例函数,显示如何获取文件列表。

void __fastcall TForm1::GetDirList(TStrings *List, const AnsiString SearchStr)
{
 TSearchRec SRec;
 AnsiString TempFName;

 List->Clear();

 // start search
 if (FindFirst(SearchStr, faAnyFile, SRec) == 0)
 {
   do
   { 
     if ((SRec.Attr & faDirectory) != faDirectory) // exclude directories
     {
       List->Add(SRec.Name);
     } // end if
   } 
   while (FindNext(SRec) == 0);

   FindClose(SRec);
 } // end if
} 

<强>示例:     //获取目录中所有文件的列表     GetDirList(MyStringList,“C:\ images *。*”);

// get list of all .bmp files in directory
GetDirList(MyStringList, "C:\images\*.bmp");

答案 4 :(得分:0)

如果您可以升级到较新版本的C ++ Builder,请查看TMS AdvSmoothImageListBox中的TMS Software

TMS AdvSmoothImageListBox

来自Embarcadero网站的TMS Smooth Controls are available free for C++Builder 2010用户。