add support for resources forks in wxCopyFile() (modified patch 1620336)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45308 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
7816e624f3
commit
0597e7f977
@ -117,6 +117,7 @@ wxMac:
|
|||||||
|
|
||||||
- Fix duplicate (empty) help menu in non-English programs (Andreas Jacobs)
|
- Fix duplicate (empty) help menu in non-English programs (Andreas Jacobs)
|
||||||
- Allow accelerators to be used with buttons too (Ryan Wilcox)
|
- Allow accelerators to be used with buttons too (Ryan Wilcox)
|
||||||
|
- Support resource forks in wxCopyFile() (Hank Schultz)
|
||||||
|
|
||||||
wxMSW:
|
wxMSW:
|
||||||
|
|
||||||
|
@ -1178,10 +1178,12 @@ true if successful.
|
|||||||
\func{bool}{wxCopyFile}{\param{const wxString\& }{file1}, \param{const wxString\& }{file2}, \param{bool }{overwrite = true}}
|
\func{bool}{wxCopyFile}{\param{const wxString\& }{file1}, \param{const wxString\& }{file2}, \param{bool }{overwrite = true}}
|
||||||
|
|
||||||
Copies {\it file1} to {\it file2}, returning true if successful. If
|
Copies {\it file1} to {\it file2}, returning true if successful. If
|
||||||
{\it overwrite} parameter is true (default), the destination file is overwritten
|
{\it overwrite} parameter is \true (default), the destination file is overwritten
|
||||||
if it exists, but if {\it overwrite} is false, the functions fails in this
|
if it exists, but if {\it overwrite} is \false, the functions fails in this
|
||||||
case.
|
case.
|
||||||
|
|
||||||
|
This function supports resources forks under Mac OS.
|
||||||
|
|
||||||
|
|
||||||
\membersection{::wxGetCwd}\label{wxgetcwd}
|
\membersection{::wxGetCwd}\label{wxgetcwd}
|
||||||
|
|
||||||
|
@ -1058,6 +1058,51 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// helper of generic implementation of wxCopyFile()
|
||||||
|
#if !(defined(__WIN32__) || defined(__OS2__) || defined(__PALMOS__)) && \
|
||||||
|
wxUSE_FILE
|
||||||
|
|
||||||
|
static bool
|
||||||
|
wxDoCopyFile(wxFile& fileIn,
|
||||||
|
const wxStructStat& fbuf,
|
||||||
|
const wxString& filenameDst,
|
||||||
|
bool overwrite)
|
||||||
|
{
|
||||||
|
// reset the umask as we want to create the file with exactly the same
|
||||||
|
// permissions as the original one
|
||||||
|
wxCHANGE_UMASK(0);
|
||||||
|
|
||||||
|
// create file2 with the same permissions than file1 and open it for
|
||||||
|
// writing
|
||||||
|
|
||||||
|
wxFile fileOut;
|
||||||
|
if ( !fileOut.Create(filenameDst, overwrite, fbuf.st_mode & 0777) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// copy contents of file1 to file2
|
||||||
|
char buf[4096];
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
ssize_t count = fileIn.Read(buf, WXSIZEOF(buf));
|
||||||
|
if ( count == wxInvalidOffset )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// end of file?
|
||||||
|
if ( !count )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( fileOut.Write(buf, count) < (size_t)count )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we can expect fileIn to be closed successfully, but we should ensure
|
||||||
|
// that fileOut was closed as some write errors (disk full) might not be
|
||||||
|
// detected before doing this
|
||||||
|
return fileIn.Close() && fileOut.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // generic implementation of wxCopyFile
|
||||||
|
|
||||||
// Copy files
|
// Copy files
|
||||||
bool
|
bool
|
||||||
wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
|
wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
|
||||||
@ -1107,38 +1152,49 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset the umask as we want to create the file with exactly the same
|
wxDoCopyFile(fileIn, fbuf, file2, overwrite);
|
||||||
// permissions as the original one
|
|
||||||
wxCHANGE_UMASK(0);
|
|
||||||
|
|
||||||
// create file2 with the same permissions than file1 and open it for
|
#if defined(__WXMAC__) || defined(__WXCOCOA__)
|
||||||
// writing
|
// copy the resource fork of the file too if it's present
|
||||||
|
wxString pathRsrcOut;
|
||||||
|
wxFile fileRsrcIn;
|
||||||
|
|
||||||
wxFile fileOut;
|
|
||||||
if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// copy contents of file1 to file2
|
|
||||||
char buf[4096];
|
|
||||||
for ( ;; )
|
|
||||||
{
|
{
|
||||||
ssize_t count = fileIn.Read(buf, WXSIZEOF(buf));
|
// suppress error messages from this block as resource forks don't have
|
||||||
if ( count == wxInvalidOffset )
|
// to exist
|
||||||
return false;
|
wxLogNull noLog;
|
||||||
|
|
||||||
// end of file?
|
// it's not enough to check for file existence: it always does on HFS
|
||||||
if ( !count )
|
// but is empty for files without resources
|
||||||
break;
|
if ( fileRsrcIn.Open(file1 + wxT("/..namedfork/rsrc")) &&
|
||||||
|
fileRsrcIn.Length() > 0 )
|
||||||
|
{
|
||||||
|
// we must be using HFS or another filesystem with resource fork
|
||||||
|
// support, suppose that destination file system also is HFS[-like]
|
||||||
|
pathRsrcOut = file2 + wxT("/..namedfork/rsrc");
|
||||||
|
}
|
||||||
|
else // check if we have resource fork in separate file (non-HFS case)
|
||||||
|
{
|
||||||
|
wxFileName fnRsrc(file1);
|
||||||
|
fnRsrc.SetName(wxT("._") + fnRsrc.GetName());
|
||||||
|
|
||||||
if ( fileOut.Write(buf, count) < (size_t)count )
|
fileRsrcIn.Close();
|
||||||
return false;
|
if ( fileRsrcIn.Open( fnRsrc.GetFullPath() ) )
|
||||||
|
{
|
||||||
|
fnRsrc = file2;
|
||||||
|
fnRsrc.SetName(wxT("._") + fnRsrc.GetName());
|
||||||
|
|
||||||
|
pathRsrcOut = fnRsrc.GetFullPath();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we can expect fileIn to be closed successfully, but we should ensure
|
if ( !pathRsrcOut.empty() )
|
||||||
// that fileOut was closed as some write errors (disk full) might not be
|
{
|
||||||
// detected before doing this
|
if ( !wxDoCopyFile(fileRsrcIn, fbuf, pathRsrcOut, overwrite) )
|
||||||
if ( !fileIn.Close() || !fileOut.Close() )
|
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
#endif // wxMac || wxCocoa
|
||||||
|
|
||||||
#if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__)
|
#if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__)
|
||||||
// no chmod in VA. Should be some permission API for HPFS386 partitions
|
// no chmod in VA. Should be some permission API for HPFS386 partitions
|
||||||
|
Loading…
Reference in New Issue
Block a user