Dir is now usable and compilable, also added fixes for Solaris
This commit is contained in:
		
							
								
								
									
										99
									
								
								mrw/file.hpp
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								mrw/file.hpp
									
									
									
									
									
								
							@@ -1,4 +1,3 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
/** @file
 | 
					/** @file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $Id$
 | 
					    $Id$
 | 
				
			||||||
@@ -10,6 +9,9 @@
 | 
				
			|||||||
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
					    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $Log$
 | 
					    $Log$
 | 
				
			||||||
 | 
					    Revision 1.4  2005/02/28 07:17:24  marc
 | 
				
			||||||
 | 
					    Dir is now usable and compilable, also added fixes for Solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Revision 1.3  2005/02/18 15:52:20  marc
 | 
					    Revision 1.3  2005/02/18 15:52:20  marc
 | 
				
			||||||
    correection in documentation
 | 
					    correection in documentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,6 +29,7 @@
 | 
				
			|||||||
#define __MRW_FILE_HPP__
 | 
					#define __MRW_FILE_HPP__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <mrw/exception.hpp>
 | 
					#include <mrw/exception.hpp>
 | 
				
			||||||
 | 
					#include <mrw/errno.hpp>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
#include <fstream>
 | 
					#include <fstream>
 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
@@ -154,15 +157,42 @@ namespace mrw {
 | 
				
			|||||||
                                      +filename+"'");
 | 
					                                      +filename+"'");
 | 
				
			||||||
        return sz;
 | 
					        return sz;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /** @brief Remove a file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          Remove a file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          @throw mrw::unix_error in case of failure,
 | 
				
			||||||
 | 
					                                 i.e. if the file does not exist
 | 
				
			||||||
 | 
					          @param file the file name
 | 
				
			||||||
 | 
					          */
 | 
				
			||||||
 | 
					      static void remove(const std::string& file) throw(std::exception) {
 | 
				
			||||||
 | 
					        if (unlink(file.c_str()))
 | 
				
			||||||
 | 
					          throw mrw::unix_error("Cannot remove file "+file);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //============================================================================
 | 
					  //============================================================================
 | 
				
			||||||
 | 
					  /** @brief Directory access
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      Parse through directories:
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      @code
 | 
				
			||||||
 | 
					      mrw::Dir dir(mrw::ifelse(getenv("HOME"), ""));
 | 
				
			||||||
 | 
					      while (dir) {
 | 
				
			||||||
 | 
					        std::cout<<"Found ["<<dir().typestr()<<"] "<<dir().name()<<std::endl;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      @endcode
 | 
				
			||||||
 | 
					      */
 | 
				
			||||||
  class Dir {
 | 
					  class Dir {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //............................................................... typedefs
 | 
					      //............................................................... typedefs
 | 
				
			||||||
    public:
 | 
					    public:
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      //------------------------------------------------------------------ Entry
 | 
					      //------------------------------------------------------------------ Entry
 | 
				
			||||||
 | 
					      /** @brief a directory entry
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          A Directory Entry. */
 | 
				
			||||||
      class Entry {
 | 
					      class Entry {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          //........................................................... typedefs
 | 
					          //........................................................... typedefs
 | 
				
			||||||
@@ -173,9 +203,11 @@ namespace mrw {
 | 
				
			|||||||
              The type of the actual file.
 | 
					              The type of the actual file.
 | 
				
			||||||
              
 | 
					              
 | 
				
			||||||
              @note On some systems UNKNOWN is the only
 | 
					              @note On some systems UNKNOWN is the only
 | 
				
			||||||
                    value returned.
 | 
					                    value returned. This is i.e. true on
 | 
				
			||||||
 | 
					                    LINUX...
 | 
				
			||||||
              */
 | 
					              */
 | 
				
			||||||
          enum FileType {
 | 
					          enum FileType {
 | 
				
			||||||
 | 
					#ifdef _DIRENT_HAVE_D_TYPE
 | 
				
			||||||
            UNKNOWN = DT_UNKNOWN, ///< The type is unknown.
 | 
					            UNKNOWN = DT_UNKNOWN, ///< The type is unknown.
 | 
				
			||||||
            REGULAR = DT_REG,     ///< A regular file.
 | 
					            REGULAR = DT_REG,     ///< A regular file.
 | 
				
			||||||
            DIR     = DT_DIR,     ///< A directory.
 | 
					            DIR     = DT_DIR,     ///< A directory.
 | 
				
			||||||
@@ -183,6 +215,9 @@ namespace mrw {
 | 
				
			|||||||
            SOCKET  = DT_SOCK,    ///< A local-domain socket.
 | 
					            SOCKET  = DT_SOCK,    ///< A local-domain socket.
 | 
				
			||||||
            CHAR    = DT_CHR,     ///< A character device.
 | 
					            CHAR    = DT_CHR,     ///< A character device.
 | 
				
			||||||
            BLOCK   = DT_BLK      ///< A block device.
 | 
					            BLOCK   = DT_BLK      ///< A block device.
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            UNKNOWN, REGULAR, DIR, FIFO, SOCKET, CHAR, BLOCK // dummy
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          //............................................................ methods
 | 
					          //............................................................ methods
 | 
				
			||||||
@@ -191,7 +226,16 @@ namespace mrw {
 | 
				
			|||||||
          Entry(): _new(true) {}
 | 
					          Entry(): _new(true) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          /// Get the name of the actual file.
 | 
					          /// Get the name of the actual file.
 | 
				
			||||||
          operator const std::string&() throw(std::bad_exception) {
 | 
					          operator const std::string&() const throw(std::bad_exception) {
 | 
				
			||||||
 | 
					            if (_new) { // only convert to string once
 | 
				
			||||||
 | 
					              _new = false;
 | 
				
			||||||
 | 
					              _name = _dirent.d.d_name;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return _name;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          /// Get the name of the actual file.
 | 
				
			||||||
 | 
					          const std::string& name() const throw(std::bad_exception) {
 | 
				
			||||||
            if (_new) { // only convert to string once
 | 
					            if (_new) { // only convert to string once
 | 
				
			||||||
              _new = false;
 | 
					              _new = false;
 | 
				
			||||||
              _name = _dirent.d.d_name;
 | 
					              _name = _dirent.d.d_name;
 | 
				
			||||||
@@ -205,22 +249,57 @@ namespace mrw {
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          /// Get the type of the actual file.
 | 
					          /// Get the type of the actual file.
 | 
				
			||||||
          operator FileType() const throw() {
 | 
					          FileType type() const throw() {
 | 
				
			||||||
 | 
					#ifdef _DIRENT_HAVE_D_TYPE
 | 
				
			||||||
            return FileType(_dirent.d.d_type);
 | 
					            return FileType(_dirent.d.d_type);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            return UNKNOWN:
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          /// Get the type of the actual file as string.
 | 
				
			||||||
 | 
					          const std::string& typestr() const throw() {
 | 
				
			||||||
 | 
					#ifdef _DIRENT_HAVE_D_TYPE
 | 
				
			||||||
 | 
					            static const std::string UNKNOWN_("UNKNOWN");
 | 
				
			||||||
 | 
					            static const std::string REGULAR_("REGULAR");
 | 
				
			||||||
 | 
					            static const std::string DIR_("DIR");
 | 
				
			||||||
 | 
					            static const std::string FIFO_("FIFO");
 | 
				
			||||||
 | 
					            static const std::string SOCKET_("SOCKET");
 | 
				
			||||||
 | 
					            static const std::string CHAR_("CHAR");
 | 
				
			||||||
 | 
					            static const std::string BLOCK_("BLOCK");
 | 
				
			||||||
 | 
					            switch (_dirent.d.d_type) {
 | 
				
			||||||
 | 
					              case UNKNOWN: return UNKNOWN_;
 | 
				
			||||||
 | 
					              case REGULAR: return REGULAR_;
 | 
				
			||||||
 | 
					              case DIR: return DIR_;
 | 
				
			||||||
 | 
					              case FIFO: return FIFO_;
 | 
				
			||||||
 | 
					              case SOCKET: return SOCKET_;
 | 
				
			||||||
 | 
					              case CHAR: return CHAR_;
 | 
				
			||||||
 | 
					              case BLOCK: return BLOCK_;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            abort(); // this line is never reached
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            return "UNKNOWN";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
          //.......................................................... variables
 | 
					          //.......................................................... variables
 | 
				
			||||||
        private:
 | 
					        private:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          friend class Dir;
 | 
					          friend class Dir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef NAME_MAX
 | 
				
			||||||
          union { // for portability reasons, see "info readdir_r"
 | 
					          union { // for portability reasons, see "info readdir_r"
 | 
				
			||||||
              dirent d;
 | 
					              dirent d;
 | 
				
			||||||
              char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
 | 
					              char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
 | 
				
			||||||
          } _dirent;
 | 
					          } _dirent;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					          union { // for portability reasons, see "info readdir_r"
 | 
				
			||||||
 | 
					              dirent d;
 | 
				
			||||||
 | 
					              char b[offsetof (struct dirent, d_name) + 1000 + 1];
 | 
				
			||||||
 | 
					          } _dirent;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          bool _new;
 | 
					          mutable bool _new;
 | 
				
			||||||
          std::string _name;
 | 
					          mutable std::string _name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          //............................................................ methods
 | 
					          //............................................................ methods
 | 
				
			||||||
        private:
 | 
					        private:
 | 
				
			||||||
@@ -241,7 +320,7 @@ namespace mrw {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          @throw mrw::invalid_argument if directory cannot be opened
 | 
					          @throw mrw::invalid_argument if directory cannot be opened
 | 
				
			||||||
          @param dir name of the directory to open
 | 
					          @param dir name of the directory to open
 | 
				
			||||||
          @param ignoreDots ignore directories <code>.<code> and
 | 
					          @param ignoreDots ignore directories <code>.</code> and
 | 
				
			||||||
                            <code>..</code> (self anf top)
 | 
					                            <code>..</code> (self anf top)
 | 
				
			||||||
          */
 | 
					          */
 | 
				
			||||||
      Dir(const std::string& dir, bool ignoreDots=true) throw(std::exception):
 | 
					      Dir(const std::string& dir, bool ignoreDots=true) throw(std::exception):
 | 
				
			||||||
@@ -275,8 +354,10 @@ namespace mrw {
 | 
				
			|||||||
      operator bool() throw() {
 | 
					      operator bool() throw() {
 | 
				
			||||||
        static const std::string D("."), DD("..");
 | 
					        static const std::string D("."), DD("..");
 | 
				
			||||||
        static dirent* fake;
 | 
					        static dirent* fake;
 | 
				
			||||||
        if (readdir_r(_dir, &_entry.entry(), &fake)) return false;
 | 
					        if (readdir_r(_dir, &_entry.entry(), &fake) || !fake) return false;
 | 
				
			||||||
        if (_ignoreDots && _entry==Entry::DIR && (D==_entry() || D==_entry()))
 | 
					        if (_ignoreDots
 | 
				
			||||||
 | 
					            && (_entry.type()==Entry::UNKNOWN || _entry.type()==Entry::DIR)
 | 
				
			||||||
 | 
					            && (D==_entry() || DD==_entry()))
 | 
				
			||||||
          return operator bool();
 | 
					          return operator bool();
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user