TraverseDirectory.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "TraverseDirectory.hxx"
00023 #include <sys/types.h>
00024 #include <cstring>
00025
00026 TraverseDirectory::TraverseDirectory(void)
00027 {
00028
00029 }
00030
00031 bool TraverseDirectory::IsCurrentOrParentDir(DirectoryEntry dirEntry) const
00032 {
00033 #ifndef WIN32
00034 return !strcmp(dirEntry->d_name,".") || !strcmp(dirEntry->d_name,"..");
00035 #else
00036 return false;
00037 #endif
00038 }
00039
00040 std::string TraverseDirectory::CompleteName(const std::string& currentDirName, DirectoryEntry dirEntry) const
00041 {
00042 #ifndef WIN32
00043 bool noDirName = currentDirName == "";
00044 return noDirName? dirEntry->d_name : currentDirName+"/"+dirEntry->d_name;
00045 #else
00046 return "";
00047 #endif
00048
00049 }
00050
00051 void TraverseDirectory::TraverseHelper( Directory dir, const std::string& currentDirname,
00052 int curdepth, int maxdepth )
00053 {
00054 #ifndef WIN32
00055 dirent* dirEntry;
00056 while ((dirEntry = readdir(dir)))
00057 {
00058 if (IsCurrentOrParentDir(dirEntry))
00059 continue;
00060
00061 std::string currentItemName = CompleteName(currentDirname, dirEntry);
00062 DIR* subdir = opendir(currentItemName.c_str());
00063 if (subdir)
00064 {
00065 OnDirectory(currentItemName);
00066 if (curdepth<maxdepth || maxdepth==-1)
00067 {
00068 TraverseHelper(subdir, currentItemName, curdepth+1, maxdepth);
00069 }
00070 closedir(subdir);
00071 }else
00072 {
00073 OnFile(currentItemName);
00074 }
00075 }
00076 #else
00077 WIN32_FIND_DATA fd;
00078 HANDLE hFind;
00079 std::string tmp;;
00080 if(currentDirname!="")
00081 {
00082 tmp+=currentDirname;
00083 tmp+="/";
00084 }
00085 tmp+="*.*";
00086 hFind = FindFirstFile(tmp.c_str(), &fd);
00087 if (hFind == INVALID_HANDLE_VALUE) return;
00088
00089 do
00090 {
00091 std::string tmp2=currentDirname;
00092 tmp2+="/";
00093 tmp2+=fd.cFileName;
00094
00095 if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
00096 {
00097 if (strcmp(fd.cFileName,".") && strcmp(fd.cFileName,".."))
00098 {
00099
00100 OnDirectory(tmp2);
00101 if (curdepth<maxdepth || maxdepth==-1)
00102 {
00103 TraverseHelper(fd, tmp2, curdepth+1, maxdepth);
00104 }
00105 }
00106 }
00107 else
00108 {
00109 OnFile(tmp2);
00110 }
00111 } while (FindNextFile(hFind, &fd));
00112 FindClose(hFind);
00113 #endif
00114 }
00115
00116 void TraverseDirectory::Traverse(const std::string& rootname,int maxdepth)
00117 {
00118 #ifndef WIN32
00119 DIR* dir;
00120
00121 dir = opendir(rootname == "" ? "." : rootname.c_str());
00122
00123 if (dir)
00124 {
00125 OnDirectory(rootname);
00126 TraverseHelper(dir,rootname,0,maxdepth);
00127 closedir(dir);
00128 }
00129 #else
00130 WIN32_FIND_DATA fd;
00131 HANDLE hFind;
00132 std::string tmp = rootname;
00133 if ((tmp.rfind("/")!=tmp.length()-1)
00134 &&
00135 (tmp.rfind("\\")!=tmp.length()-1))
00136 {
00137 tmp += "\\";
00138 }
00139 tmp += "*.*";
00140 hFind = FindFirstFile(tmp.c_str(), &fd);
00141 if (hFind == INVALID_HANDLE_VALUE) return;
00142 if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
00143 {
00144 OnDirectory(rootname);
00145 TraverseHelper(fd,rootname,0,maxdepth);
00146 }
00147 FindClose(hFind);;
00148
00149 #endif
00150 }
00151
00152
00153
00154 std::string TraverseDirectory::GetExtension(const std::string& filename)
00155 {
00156 return filename.substr(filename.rfind('.')+1);
00157 }
00158