Add wxDir::GetNameWithSep() and use it to avoid consecutive slashes.

It is wrong to use dir.GetName()+"/" to obtain a slash-terminated directory
name as this results in (usually harmless but at best ugly) double slashes at
at the beginning of the string for the root directory. Add GetNameWithSep() to
obtain the correct result in all cases.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2012-05-04 20:35:31 +00:00
parent 50cbca27ad
commit c9f6f0a8cd
5 changed files with 54 additions and 4 deletions

View File

@@ -496,6 +496,7 @@ All:
- Added wxFileName::Exists(). - Added wxFileName::Exists().
- Implement wxThread::SetConcurrency() for POSIX systems (Igor Korot). - Implement wxThread::SetConcurrency() for POSIX systems (Igor Korot).
- Fix deadlock due to too many events in Unix console apps (Lukasz Michalski). - Fix deadlock due to too many events in Unix console apps (Lukasz Michalski).
- Added wxDir::GetNameWithSep().
All (GUI): All (GUI):

View File

@@ -106,6 +106,10 @@ public:
// get the full name of the directory (without '/' at the end) // get the full name of the directory (without '/' at the end)
wxString GetName() const; 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 // file enumeration routines
// ------------------------- // -------------------------

View File

@@ -218,11 +218,31 @@ public:
int flags = wxDIR_DEFAULT) const; int flags = wxDIR_DEFAULT) const;
/** /**
Returns the name of the directory itself. The returned string does not Returns the name of the directory itself.
have the trailing path separator (slash or backslash).
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; 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 Continue enumerating files which satisfy the criteria specified by the
last call to GetFirst(). last call to GetFirst().

View File

@@ -72,6 +72,28 @@ bool wxDir::HasSubDirs(const wxString& spec) const
#endif // !Unix #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() // wxDir::Traverse()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -87,8 +109,7 @@ size_t wxDir::Traverse(wxDirTraverser& sink,
size_t nFiles = 0; size_t nFiles = 0;
// the name of this dir with path delimiter at the end // the name of this dir with path delimiter at the end
wxString prefix = GetName(); const wxString prefix = GetNameWithSep();
prefix += wxFILE_SEP_PATH;
// first, recurse into subdirs // first, recurse into subdirs
if ( flags & wxDIR_DIRS ) if ( flags & wxDIR_DIRS )

View File

@@ -235,9 +235,13 @@ void DirTestCase::GetName()
CPPUNIT_ASSERT( d.Open(".") ); CPPUNIT_ASSERT( d.Open(".") );
CPPUNIT_ASSERT( d.GetName().Last() != wxFILE_SEP_PATH ); 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__ #ifdef __UNIX__
CPPUNIT_ASSERT( d.Open("/") ); CPPUNIT_ASSERT( d.Open("/") );
CPPUNIT_ASSERT_EQUAL( "/", d.GetName() ); CPPUNIT_ASSERT_EQUAL( "/", d.GetName() );
CPPUNIT_ASSERT_EQUAL( "/", d.GetNameWithSep() );
#endif #endif
} }