diff options
author | Brad King <brad.king@kitware.com> | 2009-04-15 13:57:57 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-04-15 13:57:57 (GMT) |
commit | d3363beb2f5b4bedee95aae6f6697f059ed3f48b (patch) | |
tree | f18969c5c589724ed99eab30f38607f63a9ae116 /Source/cmSystemTools.cxx | |
parent | 6218a1a7863ce3040ed7b7a724f10731973d6683 (diff) | |
download | CMake-d3363beb2f5b4bedee95aae6f6697f059ed3f48b.zip CMake-d3363beb2f5b4bedee95aae6f6697f059ed3f48b.tar.gz CMake-d3363beb2f5b4bedee95aae6f6697f059ed3f48b.tar.bz2 |
ENH: Move RenameFile to cmSystemTools
This moves the cmGeneratedFileStream::RenameFile method implementation
into cmSystemTools. It works only within a single filesystem volume,
but is atomic when the operating system permits.
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r-- | Source/cmSystemTools.cxx | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 84ed729..4fb9afa 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1108,6 +1108,56 @@ bool cmSystemTools::CopyFileIfDifferent(const char* source, return Superclass::CopyFileIfDifferent(source, destination); } +//---------------------------------------------------------------------------- +bool cmSystemTools::RenameFile(const char* oldname, const char* newname) +{ +#ifdef _WIN32 + /* On Windows the move functions will not replace existing files. + Check if the destination exists. */ + struct stat newFile; + if(stat(newname, &newFile) == 0) + { + /* The destination exists. We have to replace it carefully. The + MoveFileEx function does what we need but is not available on + Win9x. */ + OSVERSIONINFO osv; + DWORD attrs; + + /* Make sure the destination is not read only. */ + attrs = GetFileAttributes(newname); + if(attrs & FILE_ATTRIBUTE_READONLY) + { + SetFileAttributes(newname, attrs & ~FILE_ATTRIBUTE_READONLY); + } + + /* Check the windows version number. */ + osv.dwOSVersionInfoSize = sizeof(osv); + GetVersionEx(&osv); + if(osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + { + /* This is Win9x. There is no MoveFileEx implementation. We + cannot quite rename the file atomically. Just delete the + destination and then move the file. */ + DeleteFile(newname); + return MoveFile(oldname, newname); + } + else + { + /* This is not Win9x. Use the MoveFileEx implementation. */ + return MoveFileEx(oldname, newname, MOVEFILE_REPLACE_EXISTING); + } + } + else + { + /* The destination does not exist. Just move the file. */ + return MoveFile(oldname, newname); + } +#else + /* On UNIX we have an OS-provided call to do this atomically. */ + return rename(oldname, newname) == 0; +#endif +} + bool cmSystemTools::ComputeFileMD5(const char* source, char* md5out) { #if defined(CMAKE_BUILD_WITH_CMAKE) |