wxString JoinPaths(const wxString& path, const wxString& file) { if (path.IsEmpty()) { return file; } else if (file.IsEmpty()) { return path; } return StripSeparators(path, wxString::trailing) + wxFileName::GetPathSeparator() + StripSeparators(file, wxString::leading); }
bool CPath::IsSameDir(const CPath& other) const { wxString a = m_filesystem; wxString b = other.m_filesystem; // This check is needed to avoid trouble in the // case where one path is empty, and the other // points to the root dir. if (a.Length() && b.Length()) { a = StripSeparators(a, wxString::trailing); b = StripSeparators(b, wxString::trailing); } return ::IsSameAs(a, b); }
bool CPath::StartsWith(const CPath& other) const { // It doesn't make sense comparing invalid paths, // especially since if 'other' was empty, it would // be considered a prefix of any path. if ((IsOk() && other.IsOk()) == false) { return false; } // Adding an seperator to avoid partial matches, such as // "/usr/bi" matching "/usr/bin". TODO: Paths should be // normalized first (in the constructor). const wxString a = StripSeparators(m_filesystem, wxString::trailing) + wxFileName::GetPathSeparator(); const wxString b = StripSeparators(other.m_filesystem, wxString::trailing) + wxFileName::GetPathSeparator(); if (a.Length() < b.Length()) { // Cannot possibly be a prefix. return false; } const size_t checkLen = std::min(a.Length(), b.Length()); return PATHNCMP(a.c_str(), b.c_str(), checkLen) == 0; }
/** Readies a path for use with wxAccess.. */ wxString DoCleanPath(const wxString& path) { #ifdef __WXMSW__ // stat fails on windows if there are trailing path-separators. wxString cleanPath = StripSeparators(path, wxString::trailing); // Root paths must end with a separator (X:\ rather than X:). // See comments in wxDirExists. if ((cleanPath.Length() == 2) && (cleanPath.Last() == wxT(':'))) { cleanPath += wxFileName::GetPathSeparator(); } return cleanPath; #else return path; #endif }