[ 1585270 ] Further fixes to wxPathList

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42538 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2006-10-27 17:59:32 +00:00
parent 46b59ead9d
commit 34e2d9439b
3 changed files with 49 additions and 32 deletions

View File

@ -2,12 +2,10 @@
The path list is a convenient way of storing a number of directories, and
when presented with a filename without a directory, searching for an existing file
in those directories. Storing the filename only in an application's files and
using a locally-defined list of directories makes the application and its files more
portable.
in those directories.
Use the \helpref{wxFileName::SplitPath}{wxfilenamesplitpath} global function
to extract the filename from the path.
Be sure to look also at \helpref{wxStandardPaths}{wxstandardpaths} if you only
want to search files in some standard paths.
\wxheading{Derived from}
@ -40,17 +38,19 @@ Constructs the object calling the \helpref{Add}{wxpathlistadd} function.
\func{void}{AddEnvList}{\param{const wxString\& }{env\_variable}}
Finds the value of the given environment variable, and adds all paths
to the path list. Useful for finding files in the PATH variable, for
to the path list. Useful for finding files in the {\tt PATH} variable, for
example.
\membersection{wxPathList::Add}\label{wxpathlistadd}
\func{void}{Add}{\param{const wxString\& }{path}}
\func{bool}{Add}{\param{const wxString\& }{path}}
\func{void}{Add}{\param{const wxArrayString\& }{arr}}
The first form adds the given directory to the path list, if the path is not already in the list.
If the path cannot be normalized for some reason, it returns \false.
The second form just calls the first form on all elements of the given array.
The {\it path} is always considered a directory but no existence checks will be done on it
@ -63,34 +63,42 @@ The {\it path} is always considered a directory but no existence checks will be
\membersection{wxPathList::EnsureFileAccessible}\label{wxpathlistensurefileaccessible}
\func{void}{EnsureFileAccessible}{\param{const wxString\& }{filename}}
\func{bool}{EnsureFileAccessible}{\param{const wxString\& }{filename}}
Given a full filename (with path), ensures that files in the same path
can be accessed using the pathlist. It does this by stripping the
filename and adding the path to the list if not already there.
Given a full filename (with path), ensures that the file exists and
then calls \helpref{Add}{wxpathlistadd} with the path of the file.
Returns \false if the file does not exist (and in this case its path won't be added).
\membersection{wxPathList::FindAbsoluteValidPath}\label{wxpathlistfindabsolutepath}
\constfunc{wxString}{FindAbsoluteValidPath}{\param{const wxString\& }{file}}
Searches for a full (i.e. absolute) path for an existing file by appending {\it file} to
successive members of the path list. If the file wasn't found, an empty
string is returned.
Like \helpref{FindValidPath}{wxpathlistfindvalidpath} but this function always
returns an absolute path (eventually prepending the current working directory
to the value returned \helpref{FindValidPath}{wxpathlistfindvalidpath}) or an
empty string.
\membersection{wxPathList::FindValidPath}\label{wxpathlistfindvalidpath}
\constfunc{wxString}{FindValidPath}{\param{const wxString\& }{file}}
Searches for a path for an existing file by appending {\it file} to
successive members of the path list.
If the file wasn't found, an empty string is returned.
Searches the given file in all paths stored in this class.
The first path which concatenated to the given string points to an existing
file (see \helpref{wxFileExists}{wxfileexists}) is returned.
The returned path may be relative to the current working directory.
If the file wasn't found in any of the stored paths, an empty string is returned.
The given string must be a file name, eventually with a path prefix (if the path
prefix is absolute, only its name will be searched); i.e. it must not end with
a directory separator (see \helpref{wxFileName::GetPathSeparator}{wxfilenamegetpathseparator})
otherwise an assertion will fail.
The returned path may be relative to the current working directory.
Note in fact that wxPathList can be used to store both relative and absolute paths so that
if you \helpref{Add()}{wxpathlistadd}ed relative paths, then the current working directory
(see \helpref{wxGetCwd}{wxgetcwd} and \helpref{wxSetWorkingDirectory}{wxsetworkingdirectory})
may affect the value returned by this function!

View File

@ -669,7 +669,7 @@ public:
void AddEnvList(const wxString& envVariable);
// Adds given path to this list
void Add(const wxString& path);
bool Add(const wxString& path);
void Add(const wxArrayString &paths);
// Find the first full path for which the file exists
@ -680,10 +680,12 @@ public:
wxString FindAbsoluteValidPath(const wxString& filename) const;
// Given full path and filename, add path to list
void EnsureFileAccessible(const wxString& path);
bool EnsureFileAccessible(const wxString& path);
#if WXWIN_COMPATIBILITY_2_6
// Returns true if the path is in the list
wxDEPRECATED( bool Member(const wxString& path) const );
#endif
};
#endif // _WX_FILEFN_H_

View File

@ -156,7 +156,7 @@ WXDLLEXPORT int wxOpen( const wxChar *pathname, int flags, mode_t mode )
// wxPathList
// ----------------------------------------------------------------------------
void wxPathList::Add(const wxString& path)
bool wxPathList::Add(const wxString& path)
{
// add a path separator to force wxFileName to interpret it always as a directory
// (i.e. if we are called with '/home/user' we want to consider it a folder and
@ -164,11 +164,17 @@ void wxPathList::Add(const wxString& path)
wxFileName fn(path + wxFileName::GetPathSeparator());
// add only normalized relative/absolute paths
fn.Normalize(wxPATH_NORM_DOTS|wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS);
// NB: we won't do wxPATH_NORM_DOTS in order to avoid problems when trying to
// normalize paths which starts with ".." (which can be normalized only if
// we use also wxPATH_NORM_ABSOLUTE - which we don't want to use).
if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS))
return false;
wxString toadd = fn.GetPath();
if (Index(toadd) == wxNOT_FOUND)
wxArrayString::Add(toadd); // do not add duplicates
return true;
}
void wxPathList::Add(const wxArrayString &arr)
@ -207,21 +213,17 @@ void wxPathList::AddEnvList (const wxString& WXUNUSED_IN_WINCE(envVariable))
// Given a full filename (with path), ensure that that file can
// be accessed again USING FILENAME ONLY by adding the path
// to the list if not already there.
void wxPathList::EnsureFileAccessible (const wxString& path)
bool wxPathList::EnsureFileAccessible (const wxString& path)
{
wxString path_only(wxPathOnly(path));
if ( !path_only.empty() )
{
if ( Index(path_only) == wxNOT_FOUND )
Add(path_only);
}
return Add(wxPathOnly(path));
}
// deprecated !
#if WXWIN_COMPATIBILITY_2_6
bool wxPathList::Member (const wxString& path) const
{
return Index(path) != wxNOT_FOUND;
}
#endif
wxString wxPathList::FindValidPath (const wxString& file) const
{
@ -230,8 +232,13 @@ wxString wxPathList::FindValidPath (const wxString& file) const
wxFileName fn(file);
wxString strend;
// NB: normalize without making absolute !
fn.Normalize(wxPATH_NORM_DOTS|wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS);
// NB: normalize without making absolute otherwise calling this function with
// e.g. "b/c.txt" would result in removing the directory 'b' and the for loop
// below would only add to the paths of this list the 'c.txt' part when doing
// the existence checks...
// NB: we don't use wxPATH_NORM_DOTS here, too (see wxPathList::Add for more info)
if (!fn.Normalize(wxPATH_NORM_TILDE|wxPATH_NORM_LONG|wxPATH_NORM_ENV_VARS))
return wxEmptyString;
wxASSERT_MSG(!fn.IsDir(), wxT("Cannot search for directories; only for files"));
if (fn.IsAbsolute())