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