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
00009 struct stat;
00010
00011 namespace wibble {
00012 namespace sys {
00013 namespace fs {
00014
00020 std::auto_ptr<struct stat> stat(const std::string& pathname);
00021
00023 bool access(const std::string &s, int m);
00024
00028 std::string abspath(const std::string& pathname);
00029
00033 void mkdirIfMissing(const std::string& dir, mode_t mode);
00034
00037 void mkpath(const std::string& dir);
00038
00041 void mkFilePath(const std::string& file);
00042
00044 std::string readFile(const std::string &file);
00045 void writeFile(const std::string &file, const std::string &data);
00046
00048 class Directory
00049 {
00050 std::string m_path;
00051
00052 public:
00053 class const_iterator
00054 {
00055 DIR* dir;
00056 struct dirent* d;
00057
00058 public:
00059
00060 const_iterator() : dir(0), d(0) {}
00061
00062 const_iterator(DIR* dir) : dir(dir), d(0) { ++(*this); }
00063
00064 ~const_iterator() { if (dir) closedir(dir); }
00065
00066
00067 const_iterator(const const_iterator& i)
00068 {
00069 dir = i.dir;
00070 d = i.d;
00071 const_iterator* wi = const_cast<const_iterator*>(&i);
00072 wi->dir = 0;
00073 wi->d = 0;
00074 }
00075 const_iterator& operator=(const const_iterator& i)
00076 {
00077
00078 if (&i == this) return *this;
00079 if (dir) closedir(dir);
00080 dir = i.dir;
00081 d = i.d;
00082 const_iterator* wi = const_cast<const_iterator*>(&i);
00083 wi->dir = 0;
00084 wi->d = 0;
00085 }
00086
00087 const_iterator& operator++()
00088 {
00089 if ((d = readdir(dir)) == 0)
00090 {
00091 closedir(dir);
00092 dir = 0;
00093 }
00094 return *this;
00095 }
00096
00097 std::string operator*() { return d->d_name; }
00098 struct dirent* operator->() { return d; }
00099
00100 bool operator==(const const_iterator& iter) const
00101 {
00102 return dir == iter.dir && d == iter.d;
00103 }
00104 bool operator!=(const const_iterator& iter) const
00105 {
00106 return dir != iter.dir || d != iter.d;
00107 }
00108 };
00109
00110 Directory(const std::string& path) : m_path(path) {}
00111
00113 const std::string& path() const { return m_path; }
00114
00116 bool valid();
00117
00119 const_iterator begin();
00120
00122 const_iterator end() const;
00123 };
00124
00125 }
00126 }
00127 }
00128
00129
00130 #endif