DirEntries.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:2k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // DirEntries.h
  4. //
  5. // Kari Pulli
  6. // Fri Apr  9 18:33:31 CDT 1999
  7. //
  8. // Read in directory entries.
  9. // Can filter entries by the ending.
  10. //
  11. //############################################################
  12. #ifndef _DIRENTRIES_H_
  13. #define _DIRENTRIES_H_
  14. #ifdef WIN32
  15. #  include <io.h>
  16. #  include "defines.h"
  17. #else
  18. #  include <dirent.h>
  19. #endif
  20. #include <string.h>
  21. #include <vector.h>
  22. //#include <rope.h>
  23. #include <string>
  24. class DirEntries {
  25.   int         count;
  26.   std::string m_path;
  27.   vector<std::string> m_entry;
  28. public:
  29.   
  30.   bool isdir;
  31.   
  32.   DirEntries(std::string dirname,
  33.      std::string end_filter = "")
  34.     : count(0)
  35.     {
  36. #ifdef WIN32
  37.       // Windows loop prologue
  38.       struct _finddata_t fd;
  39.       char sdfn[PATH_MAX];
  40.       sprintf (sdfn, "%s/*", dirname.c_str());
  41.       long fh = _findfirst (sdfn, &fd);
  42.       isdir = (fh > 0);
  43.       if (!isdir) return;
  44.       while (1) {
  45. char *name = fd.name;
  46. #else
  47.       // Unix loop prologue
  48.       DIR *dirp = opendir(dirname.c_str());
  49.       isdir = (dirp != NULL);
  50.       if (!isdir) return;
  51.       struct dirent *direntp;
  52.       while ((direntp = readdir(dirp)) != NULL) {
  53. char *name = direntp->d_name;
  54. #endif
  55. // loop body, shared
  56. if (strcmp(name, ".")  != 0 && strcmp(name, "..") != 0) {
  57.   if (end_filter.size()) {
  58.     if (strcmp(&name[strlen(name)-end_filter.size()], 
  59.        end_filter.c_str()) == 0)
  60.       {
  61. m_entry.push_back(std::string(name));
  62.       }
  63.   }
  64. }
  65. #ifndef WIN32
  66.       // Windows loop epilogue
  67.       }
  68.       closedir(dirp);
  69.       m_path.assign(dirname);
  70.       m_path += "/";
  71. #else
  72.       // Unix loop epilogue
  73. if (_findnext (fh, &fd))
  74.   break;
  75.       }
  76.       _findclose (fh);
  77.       m_path.assign(dirname);
  78.       m_path += "\";
  79. #endif
  80.     }
  81.   void next(void)
  82.     {
  83.       count++;
  84.     }
  85.   bool done(void)
  86.     {
  87.       return (count >= m_entry.size());
  88.     }
  89.   std::string &entry(void)
  90.     {
  91.       return m_entry[count];
  92.     }
  93.   std::string path(void)
  94.     {
  95.       return m_path + m_entry[count];
  96.     }
  97.   int size(void)
  98.     {
  99.       return m_entry.size();
  100.     }
  101. };
  102. #if 0
  103. #include <iostream.h>
  104. void 
  105. main(int argc, char **argv)
  106. {
  107.   for (DirEntries de(argv[1], argc>2 ? argv[2] : NULL);
  108.        !de.done(); de.next()) {
  109.     cout << de.entry() << endl;
  110.   }
  111. }
  112. #endif
  113. #endif