diff --git a/docs/changes.txt b/docs/changes.txt index 197a1565e0..40788167be 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -496,6 +496,7 @@ All: - Added wxFileName::Exists(). - Implement wxThread::SetConcurrency() for POSIX systems (Igor Korot). - Fix deadlock due to too many events in Unix console apps (Lukasz Michalski). +- Added wxDir::GetNameWithSep(). All (GUI): diff --git a/include/wx/dir.h b/include/wx/dir.h index 94c5d453c0..0781b13c13 100644 --- a/include/wx/dir.h +++ b/include/wx/dir.h @@ -106,6 +106,10 @@ public: // get the full name of the directory (without '/' at the end) wxString GetName() const; + // Same as GetName() but does include the trailing separator, unless the + // string is empty (only for invalid directories). + wxString GetNameWithSep() const; + // file enumeration routines // ------------------------- diff --git a/interface/wx/dir.h b/interface/wx/dir.h index ecf8ffb724..42a8288b24 100644 --- a/interface/wx/dir.h +++ b/interface/wx/dir.h @@ -218,11 +218,31 @@ public: int flags = wxDIR_DEFAULT) const; /** - Returns the name of the directory itself. The returned string does not - have the trailing path separator (slash or backslash). + Returns the name of the directory itself. + + The returned string does not have the trailing path separator (slash or + backslash). + + Notice that in spite of this the last character of the returned string + can still be the path separator if this directory is the root one. + Because of this, don't append ::wxFILE_SEP_PATH to the returned value + if you do need a slash-terminated directory name but use + GetNameWithSep() instead to avoid having duplicate consecutive slashes. */ wxString GetName() const; + /** + Returns the name of the directory with the path separator appended. + + The last character of the returned string is always ::wxFILE_SEP_PATH + unless the string is empty, indicating that this directory is invalid. + + @see GetName() + + @since 2.9.4 + */ + wxString GetNameWithSep() const; + /** Continue enumerating files which satisfy the criteria specified by the last call to GetFirst(). diff --git a/src/common/dircmn.cpp b/src/common/dircmn.cpp index f5b0c9fe8a..1638cff0ac 100644 --- a/src/common/dircmn.cpp +++ b/src/common/dircmn.cpp @@ -72,6 +72,28 @@ bool wxDir::HasSubDirs(const wxString& spec) const #endif // !Unix +// ---------------------------------------------------------------------------- +// wxDir::GetNameWithSep() +// ---------------------------------------------------------------------------- + +wxString wxDir::GetNameWithSep() const +{ + // Note that for historical reasons (i.e. because GetName() was there + // first) we implement this one in terms of GetName() even though it might + // actually make more sense to reverse this logic. + + wxString name = GetName(); + if ( !name.empty() ) + { + // Notice that even though GetName() isn't supposed to return the + // separator, it can still be present for the root directory name. + if ( name.Last() != wxFILE_SEP_PATH ) + name += wxFILE_SEP_PATH; + } + + return name; +} + // ---------------------------------------------------------------------------- // wxDir::Traverse() // ---------------------------------------------------------------------------- @@ -87,8 +109,7 @@ size_t wxDir::Traverse(wxDirTraverser& sink, size_t nFiles = 0; // the name of this dir with path delimiter at the end - wxString prefix = GetName(); - prefix += wxFILE_SEP_PATH; + const wxString prefix = GetNameWithSep(); // first, recurse into subdirs if ( flags & wxDIR_DIRS ) diff --git a/tests/file/dir.cpp b/tests/file/dir.cpp index c5151d243e..81d66ad53e 100644 --- a/tests/file/dir.cpp +++ b/tests/file/dir.cpp @@ -235,9 +235,13 @@ void DirTestCase::GetName() CPPUNIT_ASSERT( d.Open(".") ); CPPUNIT_ASSERT( d.GetName().Last() != wxFILE_SEP_PATH ); + CPPUNIT_ASSERT( d.GetNameWithSep().Last() == wxFILE_SEP_PATH ); + CPPUNIT_ASSERT_EQUAL( d.GetName() + wxFILE_SEP_PATH, + d.GetNameWithSep() ); #ifdef __UNIX__ CPPUNIT_ASSERT( d.Open("/") ); CPPUNIT_ASSERT_EQUAL( "/", d.GetName() ); + CPPUNIT_ASSERT_EQUAL( "/", d.GetNameWithSep() ); #endif }