Титульная страница   Пространства имен   Иерархия классов   Алфавитный указатель   Классы   Файлы   Члены пространства имен   Члены классов   Члены файла  

Класс FindFileImpl

Класс-реализация интерфейса FindFile. Подробнее...

Граф наследования:FindFileImpl:

FindFile Полный список членов класса

Закрытые члены

virtual bool find (const std::string &dir, bool recur, const std::string &mask, FindFileCallback &cb)
 Данная реализация осуществляет сопоставление найденных файлов с маской посредством интерфейса NameMatcher.


Подробное описание

Класс-реализация интерфейса FindFile.

Для поиска в каталоге используется относительно стандартное семейство функций readdir(), а символ '/' выбран в качестве разделителя элементов пути.

См. определение в файле findfileimpl.cpp строка 44


Методы

bool FindFileImpl::find const std::string &  dir,
bool  recur,
const std::string &  mask,
FindFileCallback cb
[private, virtual]
 

Данная реализация осуществляет сопоставление найденных файлов с маской посредством интерфейса NameMatcher.

Замещает FindFile.

См. определение в файле findfileimpl.cpp строка 53

Перекрестные ссылки _FLINE_, FindFileCallback::found(), newCException(), Factory::newNameMatcher() и toCException().

00055  {
00056   try {
00057       DIR *d=opendir(dir.c_str());
00058       if (!d) {
00059          throw newCException(_FLINE_, StringBuf("Can't open \"")+dir+
00060            "\" directory: "+strerror(errno));
00061       }
00062       AutoDIR autoDIR(d);
00063 
00064       typedef list<string> list_type;
00065       list_type subDirs;
00066 
00067       sh_ptr<NameMatcher> nm=Factory::newNameMatcher(mask);
00068 
00069       struct stat statbuf;
00070       dirent *ent;
00071       while (ent=readdir(d)) {
00072             if (!strcmp(ent->d_name,".") || !strcmp(ent->d_name,"..")) continue;
00073 
00074             string fname(StringBuf(dir)+"/"+ent->d_name);
00075             if (stat(fname.c_str(), &statbuf)) {
00076                throw newCException(_FLINE_, StringBuf("Can't stat \"")+fname+
00077                  "\": "+strerror(errno));
00078             }
00079 
00080             if (statbuf.st_mode&S_IFDIR) {
00081                subDirs.push_back(fname);
00082                continue;
00083             }
00084 
00085             if (!nm->match(ent->d_name)) continue;
00086 
00087             if (!cb.found(fname)) return 0;
00088       }
00089 
00090       if (recur) {
00091          for (list_type::const_iterator cit=subDirs.begin(), cend=subDirs.end();
00092               cit!=cend; ++cit) {
00093              if (!find(*cit, recur, mask, cb)) return 0;
00094          }
00095       }
00096 
00097       return 1;
00098   }
00099   catch (...) {
00100         throw newCException(_FLINE_, StringBuf("Can't process \"")+dir+
00101           "\" directory", toCException(_FLINE_));
00102   }
00103  }


Объявления и описания членов класса находятся в файле:
Документация по ftext. Последние изменения: Sat Mar 20 17:58:15 2004. Создано системой doxygen1.3