00001 #ifndef WIBBLE_SYS_DIRECTORY_H
00002 #define WIBBLE_SYS_DIRECTORY_H
00003
00004 #include <string>
00005 #include <dirent.h>
00006 #include <memory>
00007 #include <sys/types.h>
00008 #include <sys/stat.h>
00009
00010 struct stat;
00011
00012 namespace wibble {
00013 namespace sys {
00014 namespace fs {
00015
00021 std::auto_ptr<struct stat> stat(const std::string& pathname);
00022
00024 bool access(const std::string &s, int m);
00025
00029 std::string abspath(const std::string& pathname);
00030
00034 void mkdirIfMissing(const std::string& dir, mode_t mode);
00035
00038 void mkpath(const std::string& dir);
00039
00042 void mkFilePath(const std::string& file);
00043
00045 std::string readFile(const std::string &file);
00046 void writeFile(const std::string &file, const std::string &data);
00047
00049 class Directory
00050 {
00051 std::string m_path;
00052
00053 public:
00054 class const_iterator
00055 {
00056 DIR* dir;
00057 struct dirent* d;
00058
00059 public:
00060
00061 const_iterator() : dir(0), d(0) {}
00062
00063 const_iterator(DIR* dir) : dir(dir), d(0) { ++(*this); }
00064
00065 ~const_iterator() { if (dir) closedir(dir); }
00066
00067
00068 const_iterator(const const_iterator& i)
00069 {
00070 dir = i.dir;
00071 d = i.d;
00072 const_iterator* wi = const_cast<const_iterator*>(&i);
00073 wi->dir = 0;
00074 wi->d = 0;
00075 }
00076 const_iterator& operator=(const const_iterator& i)
00077 {
00078
00079 if (&i == this) return *this;
00080 if (dir) closedir(dir);
00081 dir = i.dir;
00082 d = i.d;
00083 const_iterator* wi = const_cast<const_iterator*>(&i);
00084 wi->dir = 0;
00085 wi->d = 0;
00086 }
00087
00088 const_iterator& operator++()
00089 {
00090 if ((d = readdir(dir)) == 0)
00091 {
00092 closedir(dir);
00093 dir = 0;
00094 }
00095 return *this;
00096 }
00097
00098 std::string operator*() { return d->d_name; }
00099 struct dirent* operator->() { return d; }
00100
00101 bool operator==(const const_iterator& iter) const
00102 {
00103 return dir == iter.dir && d == iter.d;
00104 }
00105 bool operator!=(const const_iterator& iter) const
00106 {
00107 return dir != iter.dir || d != iter.d;
00108 }
00109 };
00110
00111 Directory(const std::string& path) : m_path(path) {}
00112
00114 const std::string& path() const { return m_path; }
00115
00117 bool valid();
00118
00120 const_iterator begin();
00121
00123 const_iterator end() const;
00124 };
00125
00126 }
00127 }
00128 }
00129
00130
00131 #endif