#pragma region Includes #define WIN32_LEAN_AND_MEAN #define STRICT #include #include "PathName.h" #include #pragma endregion /////////////////////////////////////////////////////////// // utility /////////////////////////////////////////////////////////// std::string& operator<<(std::string& str, int n) { std::strstream convert; convert << n << '\0'; str += convert.str(); return str; } std::string& operator<<(std::string& str, char c) { const char s[2] = { c, '\0' }; str += s; return str; } /////////////////////////////////////////////////////////// // CPathName /////////////////////////////////////////////////////////// std::string CPathName::Path() const { char drive[_MAX_DRIVE], dir[_MAX_DIR]; _splitpath_s(c_str(), drive, sizeof(drive), dir, sizeof(dir), NULL, 0, NULL, 0); std::string s = drive; s += dir; return s; } std::string CPathName::FullName() const { char name[_MAX_FNAME], ext[_MAX_EXT]; _splitpath_s(c_str(), NULL, 0, NULL, 0, name, sizeof(name), ext, sizeof(ext)); std::string s = name; s += ext; return s; } std::string CPathName::Name() const { char name[_MAX_FNAME]; _splitpath_s(c_str(), NULL, 0, NULL, 0, name, sizeof(name), NULL, 0); return name; } std::string CPathName::Ext() const { char ext[_MAX_EXT]; _splitpath_s(c_str(), NULL, 0, NULL, 0, NULL, 0, ext, sizeof(ext)); return ext; } CPathName& CPathName::Set(const char* p, const char* n, const char* e) { char path[_MAX_PATH]; _makepath_s(path, sizeof(path), NULL, p, n, e); return operator=(path); } CPathName& CPathName::SetPath(const char* p) { char name[_MAX_FNAME], ext[_MAX_EXT], path[_MAX_PATH]; _splitpath_s(c_str(), NULL, NULL, NULL, NULL, name, sizeof(name), ext, sizeof(ext)); _makepath_s(path, sizeof(path), NULL, p, name, ext); return operator=(path); } CPathName& CPathName::SetName(const char* n) { char drive[_MAX_DRIVE], dir[_MAX_DIR], ext[_MAX_EXT], path[_MAX_PATH]; _splitpath_s(c_str(), drive, sizeof(drive), dir, sizeof(dir), NULL, 0, ext, sizeof(ext)); _makepath_s(path, sizeof(path), drive, dir, n, ext); return operator=(path); } CPathName& CPathName::SetExt(const char* e) { char drive[_MAX_DRIVE], dir[_MAX_DIR], name[_MAX_FNAME]; _splitpath_s(c_str(), drive, sizeof(drive), dir, sizeof(dir), name, sizeof(name), NULL, 0); char path[_MAX_PATH]; _makepath_s(path, sizeof(path), drive, dir, name, e); return operator=(path); } bool CPathName::IsFile() const { if (empty()) return false; DWORD dwAttrib = ::GetFileAttributesA(c_str()); return (dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY); } bool CPathName::IsDirectory() const { if (empty()) return false; DWORD dwAttrib = ::GetFileAttributesA(c_str()); return (dwAttrib != INVALID_FILE_ATTRIBUTES) && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); } size_t CPathName::List(std::vector& files) const { WIN32_FIND_DATAA ffd; HANDLE hFind = ::FindFirstFileA(c_str(), &ffd); while (hFind != INVALID_HANDLE_VALUE) { CPathName pn(ffd.cFileName); pn.SetPath(Path().c_str()); files.push_back(pn); if (!::FindNextFileA(hFind, &ffd)) { ::FindClose(hFind); hFind = INVALID_HANDLE_VALUE; } } return files.size(); }