directory.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // directory.h
  2. // 
  3. // Copyright (C) 2003, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <iostream>
  10. #include "directory.h"
  11. using namespace std;
  12. bool Directory::enumFiles(EnumFilesHandler& handler, bool deep)
  13. {
  14.     string filename;
  15.     while (nextFile(filename))
  16.     {
  17.         // Skip all files beginning with a period, most importantly, . and ..
  18.         if (filename[0] == '.')
  19.             continue;
  20.         // TODO: optimize this to avoid allocating so many strings
  21.         string pathname = handler.getPath() + string("/") + filename;
  22.         if (IsDirectory(pathname))
  23.         {
  24.             if (deep)
  25.             {
  26.                 Directory* dir = OpenDirectory(pathname);
  27.                 bool cont = true;
  28.                 if (dir != NULL)
  29.                 {
  30.                     handler.pushDir(filename);
  31.                     cont = dir->enumFiles(handler, deep);
  32.                     handler.popDir();
  33.                     delete dir;
  34.                 }
  35.                 if (!cont)
  36.                     return false;
  37.             }
  38.         }
  39.         else
  40.         {
  41.             if (!handler.process(filename))
  42.                 return false;
  43.         }
  44.     }
  45.     return true;
  46. }
  47. EnumFilesHandler::EnumFilesHandler()
  48. {
  49. }
  50. void EnumFilesHandler::pushDir(const std::string& dirName)
  51. {
  52.     if (dirStack.size() > 0)
  53.         dirStack.push_back(dirStack.back() + string("/") + dirName);
  54.     else
  55.         dirStack.push_back(dirName);
  56. }
  57. void EnumFilesHandler::popDir()
  58. {
  59.     dirStack.pop_back();
  60. }
  61. const string& EnumFilesHandler::getPath() const
  62. {
  63.     // need this so we can return a non-temporary value:
  64.     static const string emptyString("");
  65.     if (dirStack.size() > 0)
  66.         return dirStack.back();
  67.     else
  68.         return emptyString;
  69. }