always make the name of the file to replace absolute before using it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13351 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2002-01-04 13:06:28 +00:00
parent 3752e0abf1
commit 44b62d54c6
2 changed files with 29 additions and 9 deletions

View File

@@ -65,25 +65,31 @@ Associates wxTempFile with the file to be replaced and opens it. You should use
\func{bool}{Open}{\param{const wxString\& }{strName}} \func{bool}{Open}{\param{const wxString\& }{strName}}
Open the temporary file (strName is the name of file to be replaced), returns Open the temporary file, returns {\tt TRUE} on success, {\tt FALSE} if an error
TRUE on success, FALSE if an error occurred. occurred.
{\it strName} is the name of file to be replaced. The temporary file is always
created in the directory where {\it strName} is. In particular, if
{\it strName} doesn't include the path, it is created in the current directory
and the program should have write access to it for the function to succeed.
\membersection{wxTempFile::IsOpened}\label{wxtempfileisopened} \membersection{wxTempFile::IsOpened}\label{wxtempfileisopened}
\constfunc{bool}{IsOpened}{\void} \constfunc{bool}{IsOpened}{\void}
Returns TRUE if the file was successfully opened. Returns {\tt TRUE} if the file was successfully opened.
\membersection{wxTempFile::Write}\label{wxtempfilewrite} \membersection{wxTempFile::Write}\label{wxtempfilewrite}
\func{bool}{Write}{\param{const void }{*p}, \param{size\_t }{n}} \func{bool}{Write}{\param{const void }{*p}, \param{size\_t }{n}}
Write to the file, return TRUE on success, FALSE on failure. Write to the file, return {\tt TRUE} on success, {\tt FALSE} on failure.
\membersection{wxTempFile::Write}\label{wxtempfilewrites} \membersection{wxTempFile::Write}\label{wxtempfilewrites}
\func{bool}{Write}{\param{const wxString\& }{str}, \param{wxMBConv&}{ conv = wxConvLibc}} \func{bool}{Write}{\param{const wxString\& }{str}, \param{wxMBConv&}{ conv = wxConvLibc}}
Write to the file, return TRUE on success, FALSE on failure. Write to the file, return {\tt TRUE} on success, {\tt FALSE} on failure.
The second argument is only meaningful in Unicode build of wxWindows when The second argument is only meaningful in Unicode build of wxWindows when
{\it conv} is used to convert {\it str} to multibyte representation. {\it conv} is used to convert {\it str} to multibyte representation.
@@ -93,7 +99,7 @@ The second argument is only meaningful in Unicode build of wxWindows when
\func{bool}{Commit}{\void} \func{bool}{Commit}{\void}
Validate changes: deletes the old file of name m\_strName and renames the new Validate changes: deletes the old file of name m\_strName and renames the new
file to the old name. Returns TRUE if both actions succeeded. If FALSE is file to the old name. Returns {\tt TRUE} if both actions succeeded. If {\tt FALSE} is
returned it may unfortunately mean two quite different things: either that returned it may unfortunately mean two quite different things: either that
either the old file couldn't be deleted or that the new file couldn't be renamed either the old file couldn't be deleted or that the new file couldn't be renamed
to the old name. to the old name.

View File

@@ -469,6 +469,7 @@ bool wxFile::Eof() const
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// construction // construction
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxTempFile::wxTempFile(const wxString& strName) wxTempFile::wxTempFile(const wxString& strName)
{ {
Open(strName); Open(strName);
@@ -476,9 +477,22 @@ wxTempFile::wxTempFile(const wxString& strName)
bool wxTempFile::Open(const wxString& strName) bool wxTempFile::Open(const wxString& strName)
{ {
m_strName = strName; // we must have an absolute filename because otherwise CreateTempFileName()
// would create the temp file in $TMP (i.e. the system standard location
// for the temp files) which might be on another volume/drive/mount and
// wxRename()ing it later to m_strName from Commit() would then fail
//
// with the absolute filename, the temp file is created in the same
// directory as this one which ensures that wxRename() may work later
wxFileName fn(strName);
if ( !fn.IsAbsolute() )
{
fn.Normalize(wxPATH_NORM_ABSOLUTE);
}
m_strTemp = wxFileName::CreateTempFileName(strName, &m_file); m_strName = fn.GetFullPath();
m_strTemp = wxFileName::CreateTempFileName(m_strName, &m_file);
if ( m_strTemp.empty() ) if ( m_strTemp.empty() )
{ {
@@ -491,7 +505,7 @@ bool wxTempFile::Open(const wxString& strName)
mode_t mode; mode_t mode;
wxStructStat st; wxStructStat st;
if ( stat(strName.fn_str(), &st) == 0 ) if ( stat(m_strName.fn_str(), &st) == 0 )
{ {
mode = st.st_mode; mode = st.st_mode;
} }