Linux下Gtkmm枚举目录中所有文件(包含子目录),使用glibmm库.
#include <gtkmm.h>
#include <glibmm.h>
#include <giomm.h>
#include <iostream>
#include <string>
#include <vector>
using namespace Gtk;
using namespace Glib;
using namespace std;
void EnumDir(string rootpath,vector<Glib::ustring>& vString)
{
Glib::Dir dirs(rootpath);
std::list<std::string> entries (dirs.begin(), dirs.end());
for(std::list<std::string>::iterator dirItr=entries.begin();dirItr!=entries.end();dirItr++)
{
//使用流输出Glib::ustring一定要.c_str()或.raw()
//不然可提示:"terminate called after throwing an instance of 'Glib::ConvertError'".
Glib::ustring fullpath=rootpath+"/"+*dirItr;
//cout<<fullpath.c_str()<<"--------"<<endl;
//cout<<fullpath.raw()<<"#######"<<endl;
vString.push_back(fullpath);
try
{
//Glib::file_test(fullpath,Glib::FILE_TEST_IS_DIR | Glib::FILE_TEST_EXISTS)
//上述表达式表示:如果fullpath为目录或文件存在均返回真
//Glib::file_test(fullpath,Glib::FILE_TEST_EXISTS & Glib::FILE_TEST_IS_DIR)
//上述表达式表示:如果fullpath为目录且目录存在才返回真,还过这样写没必要,Glib::FILE_TEST_IS_DIR
if (Glib::file_test(fullpath,Glib::FILE_TEST_IS_DIR))
{
EnumDir(fullpath,vString);
}
}
catch(Glib::FileError er)
{
cout<<"Error:"<<fullpath.c_str()<<":"<<er.what().c_str() <<endl;
}
}
}
int main(int argc,char* argv[])
{
vector<Glib::ustring> files;
EnumDir("/home/yanxiang/桌面",files);
for(vector<Glib::ustring>::iterator itr=files.begin();itr!=files.end();itr++)
{
cout<<(*itr).c_str()<<"********"<<endl;
}
return 0;
}