9145fba301ea406bdedd889fe1ce83c28eb4304c
[anna.git] / Directory.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_io_Directory_hpp
10 #define anna_io_Directory_hpp
11
12 #include <sys/types.h>
13 #include <regex.h>
14
15 #include <vector>
16 #include <string>
17
18 #include <anna/core/RuntimeException.hpp>
19
20 namespace anna {
21
22 namespace io  {
23
24
25 /**
26    Abstraccion de un directorio de archivos sobre UNIX.
27
28    Permite recorrer el contenido de un directorio de archivos mediante iteradores.
29
30    Ejemplo de uso:
31
32    \code
33
34    #include <anna/io/io.hpp>
35
36    void f ()
37       noexcept(false)
38    {
39       Directory dir;
40
41       dir.read (".", Directory::Mode::ShortPath);
42
43       for (Directory::const_iterator ii = dir.begin (), maxii = dir.end (); ii != maxii; ii ++) {
44          const std::string& entry = Directory::data (ii);
45
46          .... procesa la entrada ...
47       }
48    }
49
50    \endcode
51 */
52 class Directory {
53 public:
54   /**
55      Formas de obtener los archivos de un directorio.
56   */
57   struct Mode {
58     enum _v {
59       ShortPath = 0, /**< Retorna solo el nombre del archivo. */
60       FullPath /**<  Retorna el nombre completo del archivo. */
61     };
62   };
63
64   typedef std::vector <std::string> Files;
65   typedef Files::const_iterator const_iterator;
66
67   /**
68      Constructor
69   */
70   Directory();
71
72   /**
73      Destructor.
74   */
75   virtual ~Directory() { clearPattern(); }
76
77   /**
78      Establece un filtro con la expresion regular que deben cumplir los archivos de este directorio.
79      \param expression Expresion regular que deben cumplir los archivos.
80      \warning Este metodo debe ser invocado antes de #read.
81   */
82   void setPattern(const char* expression) noexcept(false);
83
84   /**
85      Elimina cualquier otro filtro que pudiera haber sido establecido mediante #setPattern.
86   */
87   void clearPattern() { setPattern(NULL); }
88
89   /**
90      Lee las entradas del directorio indicado como parametro.
91      \param dirName Ruta al nombre de directorio.
92      \param mode Forma de obtener el nombre del los archivos.
93   */
94   void read(const char* dirName, const Mode::_v mode) noexcept(false);
95
96   /**
97      Lee las entradas del directorio indicado como parametro.
98      \param dirName Ruta al nombre de directorio.
99      \param mode Forma de obtener el nombre del los archivos.
100   */
101   void read(const std::string& dirName,  const Mode::_v mode) noexcept(false)  { read(dirName.c_str(), mode); }
102
103   /**
104      Devuelve un iterador a la primera entrada del directorio.
105      \return Un iterador a la primera entrada del directorio.
106   */
107   const_iterator begin() const { return a_files.begin(); }
108
109   /**
110      Devuelve un iterador a la ultima entrada del directorio.
111      \return Un iterador a la utlima entrada del directorio.
112   */
113   const_iterator end() const { return a_files.end(); }
114
115   /**
116      Devuelve un iterador a la entrada del directorio que corresponde con el nombre indicado.
117      \return  un iterador a la entrada del directorio que corresponde con el nombre indicado.
118   */
119   const_iterator find(const std::string& file) const ;
120
121   /**
122      Devuelve la entrada referenciado por el iterador recibido.
123      \return  La entrada referenciado por el iterador recibido.
124   */
125   static const std::string& data(const_iterator& ii) { return *ii; }
126
127 private:
128   regex_t a_regex;
129   bool a_hasPattern;
130   Files a_files;
131 };
132
133 }
134 }
135
136 #endif