Граф наследования:FindFileImpl:
Закрытые члены | |
virtual bool | find (const std::string &dir, bool recur, const std::string &mask, FindFileCallback &cb) |
Данная реализация осуществляет сопоставление найденных файлов с маской посредством интерфейса NameMatcher. |
Для поиска в каталоге используется относительно стандартное семейство функций readdir(), а символ '/' выбран в качестве разделителя элементов пути.
См. определение в файле findfileimpl.cpp строка 44
|
Данная реализация осуществляет сопоставление найденных файлов с маской посредством интерфейса 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 } |