added and documented SplitVolume() and GetPathTerminators(); corrected SetPath() to treat the volume part properly (patch 970580)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28468 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-07-25 13:59:47 +00:00
parent f095b1fc57
commit f1e7793361
3 changed files with 155 additions and 92 deletions

View File

@@ -460,6 +460,15 @@ separators.
\helpref{GetPathSeparator}{wxfilenamegetpathseparator} \helpref{GetPathSeparator}{wxfilenamegetpathseparator}
\membersection{wxFileName::GetPathTerminators}\label{wxfilenamegetpathterminators}
\func{static wxString}{GetPathTerminators}{\param{wxPathFormat }{format = wxPATH\_NATIVE}}
Returns the string of characters which may terminate the path part. This is the
same as \helpref{GetPathSeparators}{wxfilenamegetpathseparators} except for VMS
path format where $]$ is used at the end of the path part.
\membersection{wxFileName::GetShortPath}\label{wxfilenamegetshortpath} \membersection{wxFileName::GetShortPath}\label{wxfilenamegetshortpath}
\constfunc{wxString}{GetShortPath}{\void} \constfunc{wxString}{GetShortPath}{\void}
@@ -763,6 +772,18 @@ component is. The old contents of the strings pointed to by these parameters
will be overwritten in any case (if the pointers are not {\tt NULL}). will be overwritten in any case (if the pointers are not {\tt NULL}).
\membersection{wxFileName::SplitVolume}\label{wxfilenamesplitvolume}
\func{static void}{SplitVolume}{\param{const wxString\& }{fullpath}, \param{wxString* }{volume}, \param{wxString* }{path}, \param{wxPathFormat }{format = wxPATH\_NATIVE}}
Splits the given \arg{fullpath} into the volume part (which may be empty) and
the pure path part, not containing any volume.
\wxheading{See also}
\helpref{SplitPath}{wxfilenamesplitpath}
\membersection{wxFileName::Touch}\label{wxfilenametouch} \membersection{wxFileName::Touch}\label{wxfilenametouch}
\func{bool}{Touch}{\void} \func{bool}{Touch}{\void}

View File

@@ -338,6 +338,10 @@ public:
// get the string of path separators for this format // get the string of path separators for this format
static wxString GetPathSeparators(wxPathFormat format = wxPATH_NATIVE); static wxString GetPathSeparators(wxPathFormat format = wxPATH_NATIVE);
// get the string of path terminators, i.e. characters which terminate the
// path
static wxString GetPathTerminators(wxPathFormat format = wxPATH_NATIVE);
// get the canonical path separator for this format // get the canonical path separator for this format
static wxChar GetPathSeparator(wxPathFormat format = wxPATH_NATIVE) static wxChar GetPathSeparator(wxPathFormat format = wxPATH_NATIVE)
{ return GetPathSeparators(format)[0u]; } { return GetPathSeparators(format)[0u]; }
@@ -411,6 +415,11 @@ public:
wxString *ext, wxString *ext,
wxPathFormat format = wxPATH_NATIVE); wxPathFormat format = wxPATH_NATIVE);
// split a path into volume and pure path part
static void SplitVolume(const wxString& fullpathWithVolume,
wxString *volume,
wxString *path,
wxPathFormat format = wxPATH_NATIVE);
// deprecated methods, don't use any more // deprecated methods, don't use any more
// -------------------------------------- // --------------------------------------

View File

@@ -312,19 +312,35 @@ void wxFileName::Assign(const wxString& volume,
m_name = name; m_name = name;
} }
void wxFileName::SetPath( const wxString &path, wxPathFormat format ) void wxFileName::SetPath( const wxString& pathOrig, wxPathFormat format )
{ {
m_dirs.Clear(); m_dirs.Clear();
if ( !path.empty() ) if ( pathOrig.empty() )
{ {
wxPathFormat my_format = GetFormat( format ); // no path at all
wxString my_path = path; m_relative = true;
return;
}
format = GetFormat( format );
// 0) deal with possible volume part first
wxString volume,
path;
SplitVolume(pathOrig, &volume, &path, format);
if ( !volume.empty() )
{
m_relative = false;
SetVolume(volume);
}
// 1) Determine if the path is relative or absolute. // 1) Determine if the path is relative or absolute.
wxChar leadingChar = my_path[0u]; wxChar leadingChar = path[0u];
switch (my_format) switch (format)
{ {
case wxPATH_MAC: case wxPATH_MAC:
m_relative = leadingChar == wxT(':'); m_relative = leadingChar == wxT(':');
@@ -340,7 +356,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
// actually means <UP>, whereas under DOS, double // actually means <UP>, whereas under DOS, double
// slashes can be ignored: "\\\\" is the same as "\\". // slashes can be ignored: "\\\\" is the same as "\\".
if (m_relative) if (m_relative)
my_path.erase( 0, 1 ); path.erase( 0, 1 );
break; break;
case wxPATH_VMS: case wxPATH_VMS:
@@ -358,7 +374,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
break; break;
case wxPATH_DOS: case wxPATH_DOS:
m_relative = !IsPathSeparator(leadingChar, my_format); m_relative = !IsPathSeparator(leadingChar, format);
break; break;
} }
@@ -367,7 +383,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
// was just "/" or "\\", m_dirs will be empty. We know from // was just "/" or "\\", m_dirs will be empty. We know from
// the m_relative field, if this means "nothing" or "root dir". // the m_relative field, if this means "nothing" or "root dir".
wxStringTokenizer tn( my_path, GetPathSeparators(my_format) ); wxStringTokenizer tn( path, GetPathSeparators(format) );
while ( tn.HasMoreTokens() ) while ( tn.HasMoreTokens() )
{ {
@@ -377,7 +393,7 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
// as .. under Mac. // as .. under Mac.
if (token.empty()) if (token.empty())
{ {
if (my_format == wxPATH_MAC) if (format == wxPATH_MAC)
m_dirs.Add( wxT("..") ); m_dirs.Add( wxT("..") );
// else ignore // else ignore
} }
@@ -386,11 +402,6 @@ void wxFileName::SetPath( const wxString &path, wxPathFormat format )
m_dirs.Add( token ); m_dirs.Add( token );
} }
} }
}
else // no path at all
{
m_relative = true;
}
} }
void wxFileName::Assign(const wxString& fullpath, void wxFileName::Assign(const wxString& fullpath,
@@ -1244,6 +1255,16 @@ wxString wxFileName::GetPathSeparators(wxPathFormat format)
return seps; return seps;
} }
/* static */
wxString wxFileName::GetPathTerminators(wxPathFormat format)
{
format = GetFormat(format);
// under VMS the end of the path is ']', not the path separator used to
// separate the components
return format == wxPATH_VMS ? wxString(_T(']')) : GetPathSeparators(format);
}
/* static */ /* static */
bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format) bool wxFileName::IsPathSeparator(wxChar ch, wxPathFormat format)
{ {
@@ -1618,22 +1639,16 @@ wxPathFormat wxFileName::GetFormat( wxPathFormat format )
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/* static */ /* static */
void wxFileName::SplitPath(const wxString& fullpathWithVolume, void
wxFileName::SplitVolume(const wxString& fullpathWithVolume,
wxString *pstrVolume, wxString *pstrVolume,
wxString *pstrPath, wxString *pstrPath,
wxString *pstrName,
wxString *pstrExt,
wxPathFormat format) wxPathFormat format)
{ {
format = GetFormat(format); format = GetFormat(format);
wxString fullpath = fullpathWithVolume; wxString fullpath = fullpathWithVolume;
// under VMS the end of the path is ']', not the path separator used to
// separate the components
wxString sepPath = format == wxPATH_VMS ? wxString(_T(']'))
: GetPathSeparators(format);
// special Windows UNC paths hack: transform \\share\path into share:path // special Windows UNC paths hack: transform \\share\path into share:path
if ( format == wxPATH_DOS ) if ( format == wxPATH_DOS )
{ {
@@ -1643,7 +1658,8 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume,
{ {
fullpath.erase(0, 2); fullpath.erase(0, 2);
size_t posFirstSlash = fullpath.find_first_of(sepPath); size_t posFirstSlash =
fullpath.find_first_of(GetPathTerminators(format));
if ( posFirstSlash != wxString::npos ) if ( posFirstSlash != wxString::npos )
{ {
fullpath[posFirstSlash] = wxFILE_SEP_DSK; fullpath[posFirstSlash] = wxFILE_SEP_DSK;
@@ -1672,9 +1688,26 @@ void wxFileName::SplitPath(const wxString& fullpathWithVolume,
} }
} }
if ( pstrPath )
*pstrPath = fullpath;
}
/* static */
void wxFileName::SplitPath(const wxString& fullpathWithVolume,
wxString *pstrVolume,
wxString *pstrPath,
wxString *pstrName,
wxString *pstrExt,
wxPathFormat format)
{
format = GetFormat(format);
wxString fullpath;
SplitVolume(fullpathWithVolume, pstrVolume, &fullpath, format);
// find the positions of the last dot and last path separator in the path // find the positions of the last dot and last path separator in the path
size_t posLastDot = fullpath.find_last_of(wxFILE_SEP_EXT); size_t posLastDot = fullpath.find_last_of(wxFILE_SEP_EXT);
size_t posLastSlash = fullpath.find_last_of(sepPath); size_t posLastSlash = fullpath.find_last_of(GetPathTerminators(format));
// check whether this dot occurs at the very beginning of a path component // check whether this dot occurs at the very beginning of a path component
if ( (posLastDot != wxString::npos) && if ( (posLastDot != wxString::npos) &&