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:
@@ -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}
|
||||||
|
@@ -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
|
||||||
// --------------------------------------
|
// --------------------------------------
|
||||||
|
@@ -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) &&
|
||||||
|
Reference in New Issue
Block a user