topical media & game development

talk show tell print

lib-of-vs-addons-ofxDirList-src-ofxDirList.cpp / cpp



  include <ofxDirList.h>
  include <algorithm>
  include <string>
  
  // Handy string functions
  
  static std::string::size_type idx;
  static string getExt(string filename){
      idx = filename.rfind('.');
  
      if(idx != std::string::npos){
          return filename.substr(idx+1);
      }
      else{
          return "";
      }
  }
  
  static string strToLower(string myStr){
      transform( myStr.begin(), myStr.end(), myStr.begin(), ::tolower );
      return myStr;
  }
  
  //----------------------------------------------------------
  ofxDirList::ofxDirList(){
      reset();
  }
  
  //----------------------------------------------------------
  void ofxDirList::reset(){
          allowedFileExt.clear();
          nameArray.clear();
          pathArray.clear();
  }
  
  //----------------------------------------------------------
  void ofxDirList::setVerbose(bool _verbose){
      ofLog(OF_LOG_WARNING, "ofxDirList setVerbose is depreciated use ofSetLogLevel instead");
  }
  
  //----------------------------------------------------------
  bool ofxDirList::allowExt(string ext){
          allowedFileExt.push_back( strToLower(ext) );
          return true;
  }
  
  //----------------------------------------------------------
  string ofxDirList::getName(int pos){
          if(pos >= (int)nameArray.size()) return 0;
          return nameArray[pos];
  }
  
  //----------------------------------------------------------
  string ofxDirList::getPath(int pos){
          if(pos >= (int)pathArray.size()) return 0;
          return pathArray[pos];
  }
  
  //----------------------------------------------------------
  int ofxDirList::listDir(string directory){
      directory = ofToDataPath(directory);
  
          nameArray.clear();
          pathArray.clear();
  
      if(directory.length() <= 0)return 0;
  
      //if the trailing slash was not added - then add it
          if( directory[directory.length()-1] != '/'){
          directory = directory + "/";
          }
  
          DIR *dir = NULL;
          struct dirent *entry;
  
      //open the directory
      ofLog(OF_LOG_VERBOSE, "ofxDirList - attempting to open \%s", directory.c_str());
      dir = opendir(directory.c_str());
  
          if(dir == NULL){
                  ofLog(OF_LOG_ERROR, "ofxDirList - error opening directory");
                  return 0;
          }else{
                  ofLog(OF_LOG_VERBOSE, "ofxDirList - success opening directory");
          }
  
      string entry_name = "";
      string ext = "";
          bool skip = false;
  
          while ((entry = readdir(dir)) != NULL){
  
          //turn it into a C++ string
          entry_name = entry->d_name;
  
          //lets get the length of the string here as we query it again
          int fileLen = entry_name.length();
  
                  if(fileLen <= 0)continue; //if the name is not existant
                  if(entry_name[0] == '.')continue; //ignore invisible files, ./ and ../
  
                  //by default we don't skip files unless we are checking extensions
                  skip = false;
  
                  if(allowedFileExt.size() > 0){
                          //we will skip this files unless it has an allowed extension
                          skip = true;
                          for(int i = 0; i < (int)allowedFileExt.size(); i++){
  
                                  //if the wildecard * has been entered for an ext type then don't check any extensions
                                  if( allowedFileExt[i] == "*"){ skip = false; break; }
  
                                  int extLen = allowedFileExt[i].length();
  
                                  //the extension has to be shorter than the filename - simple check
                                  if(extLen >= fileLen) continue;
  
                  //lets get the ext as lowercase
                  ext = strToLower( getExt(entry_name) );
  
                  //if no ext - then skip this ext check
                  if( ext == "" )continue;
  
                  //if we find a match then stop checking and approve this file
                  if(ext == allowedFileExt[i]){
                      skip = false;
                      break;
                  }
                          }
                  }
  
                  if(skip) continue;
  
                  //finally we store the result
          pathArray.push_back(directory + entry_name);
          nameArray.push_back(entry_name);
  
                  ofLog(OF_LOG_VERBOSE, "ofxDirList - listing \%s ", nameArray.back().c_str());
          }
  
          ofLog(OF_LOG_VERBOSE, "ofxDirList - listed \%i files in \%s", nameArray.size(), directory.c_str());
          return nameArray.size();
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.