00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OSLINK_OSDIR_HEADER_H_
00020 #define OSLINK_OSDIR_HEADER_H_
00021
00022 #if defined(unix) || defined(__unix) || defined(__unix__)
00023 #define OSLINK_OSDIR_POSIX
00024 #elif defined(_WIN32)
00025 #define OSLINK_OSDIR_WINDOWS
00026 #else
00027 #define OSLINK_OSDIR_NOTSUPPORTED
00028 #endif
00029
00030 #include <string>
00031
00032 #if defined(OSLINK_OSDIR_NOTSUPPORTED)
00033
00034 namespace oslink
00035 {
00036 class directory
00037 {
00038 public:
00039 directory(const std::string&) { }
00040 operator void*() const { return (void*)0; }
00041 std::string next() { return ""; }
00042 };
00043 }
00044
00045 #elif defined(OSLINK_OSDIR_POSIX)
00046
00047 #include <sys/types.h>
00048 #include <dirent.h>
00049
00050 namespace oslink
00051 {
00052 class directory
00053 {
00054 public:
00055 directory(const std::string& aName)
00056 : handle(opendir(aName.c_str())), willfail(false)
00057 {
00058 if (!handle)
00059 willfail = true;
00060 else
00061 {
00062 dirent* entry = readdir(handle);
00063 if (entry)
00064 current = entry->d_name;
00065 else
00066 willfail = true;
00067 }
00068 }
00069 ~directory()
00070 {
00071 if (handle)
00072 closedir(handle);
00073 }
00074 operator void*() const
00075 {
00076 return willfail ? (void*)0:(void*)(-1);
00077 }
00078 std::string next()
00079 {
00080 std::string prev(current);
00081 dirent* entry = readdir(handle);
00082 if (entry)
00083 current = entry->d_name;
00084 else
00085 willfail = true;
00086 return prev;
00087 }
00088 private:
00089 DIR* handle;
00090 bool willfail;
00091 std::string current;
00092 };
00093 }
00094
00095 #elif defined(OSLINK_OSDIR_WINDOWS)
00096
00097 #include <windows.h>
00098 #include <winbase.h>
00099
00100 namespace oslink
00101 {
00102 class directory
00103 {
00104 public:
00105 directory(const std::string& aName)
00106 : handle(INVALID_HANDLE_VALUE), willfail(false)
00107 {
00108
00109
00110 DWORD attrs = GetFileAttributes(aName.c_str());
00111 if ( (attrs == 0xFFFFFFFF) || ((attrs && FILE_ATTRIBUTE_DIRECTORY) == 0) )
00112 {
00113 willfail = true;
00114 return;
00115 }
00116 std::string Full(aName);
00117
00118 if ( (Full.length() > 0) && (Full[Full.length()-1] != '\\') )
00119 Full += "\\";
00120 WIN32_FIND_DATA entry;
00121 handle = FindFirstFile( (Full+"*").c_str(), &entry);
00122 if (handle == INVALID_HANDLE_VALUE)
00123 willfail = true;
00124 else
00125 current = entry.cFileName;
00126 }
00127 ~directory()
00128 {
00129 if (handle != INVALID_HANDLE_VALUE)
00130 FindClose(handle);
00131 }
00132
00133 operator void*() const
00134 {
00135 return willfail ? (void*)0:(void*)(-1);
00136 }
00137 std::string next()
00138 {
00139 std::string prev = current;
00140 WIN32_FIND_DATA entry;
00141 int ok = FindNextFile(handle, &entry);
00142 if (!ok)
00143 willfail = true;
00144 else
00145 current = entry.cFileName;
00146 return current;
00147 }
00148 private:
00149 HANDLE handle;
00150 bool willfail;
00151 std::string current;
00152 };
00153 }
00154
00155
00156 #endif
00157
00158 #endif
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193