#ifdef _WIN32 #include "FileWrapper.h" #include struct DirWalk::_impl { HANDLE hand; WIN32_FIND_DATA fnd; std::string root; // -1 Not Opened 0 End 1 Ready int status; }; DirWalk::DirWalk(const std::string& DirName) : _p(new _impl) { std::string realname = DirName; int sz = realname.size(); if (realname[sz - 1] != '\'') { realname.push_back('\\'); } _p->root = realname; realname.push_back('*'); _p->hand = FindFirstFile(realname.c_str(), &_p->fnd); if (_p->hand != INVALID_HANDLE_VALUE) { _p->status = 1; } else { _p->status = -1; } } DirWalk::~DirWalk() { if (_p->hand != INVALID_HANDLE_VALUE) { FindClose(_p->hand); } delete _p; } bool DirWalk::isReady() const { return _p->status >= 0; } std::string DirWalk::getroot() const { return _p->root; } int DirWalk::next(std::string& name, bool& is_dir) { if (_p->status == 1) { name = _p->fnd.cFileName; if (_p->fnd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { is_dir = true; } else { is_dir = false; } // Step down if (!FindNextFile(_p->hand, &_p->fnd)) { _p->status = 0; } return 1; } else { return 0; } } #endif // End of _WIN32