// $Source$ // $Revision$ // $Date$ // $Author$ #ifndef __dir_ih__ #define __dir_ih__ #include "dir.hh" #include "pxx_sys_error.ih" namespace rftype { #ifndef WINDOWS inline Dir::Dir (const char* _name) : dir_ptr (opendir(_name)) { if (!dir_ptr) throw_sys_error(errno); } #else inline Dir::Dir (const char* _name) : is_first (true) { char name [MAX_PATH]; if (snprintf(name, MAX_PATH, "%s\\*", _name) < 0) throw_sys_error(ERROR_FILENAME_EXCED_RANGE); hDir = FindFirstFile(name, &fd); if (hDir == INVALID_HANDLE_VALUE) throw_sys_error(GetLastError()); } #endif inline Dir::~Dir () { close(); } #ifndef WINDOWS inline char* Dir::read () { if (!dir_ptr) return null; errno = 0; struct dirent* ep = readdir(dir_ptr); if (!ep) { if (errno) throw_sys_error(errno); return null; } return ep->d_name; } #else inline char* Dir::read() { if (!hDir) return null; if (is_first) { is_first = false; } else { if (!FindNextFile(hDir, &fd)) { DWORD error = GetLastError(); if (error != ERROR_NO_MORE_FILES) throw_sys_error(error); return null; } } return fd.cFileName; } #endif #ifndef WINDOWS inline void Dir::close () { if (dir_ptr) { if (closedir(dir_ptr)) throw_sys_error(errno); dir_ptr = null; } } #else inline void Dir::close () { if (hDir) { if (FindClose(hDir) == 0) throw_sys_error(GetLastError()); hDir = null; } } #endif } #endif // __dir_ih__