Index: base/file_util_win.cc |
=================================================================== |
--- base/file_util_win.cc (revision 11294) |
+++ base/file_util_win.cc (working copy) |
@@ -101,8 +101,16 @@ |
to_path.value().length() >= MAX_PATH) { |
return false; |
} |
- return (MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), |
- MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0); |
+ if (MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), |
+ MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0) |
+ return true; |
+ if (DirectoryExists(from_path)) { |
+ // MoveFileEx fails if moving directory across volumes. We will simulate |
+ // the move by using Copy and Delete. Ideally we could check whether |
+ // from_path and to_path are indeed in different volumes. |
+ return CopyAndDeleteDirectory(from_path, to_path); |
+ } |
+ return false; |
} |
bool CopyFile(const FilePath& from_path, const FilePath& to_path) { |
@@ -167,6 +175,21 @@ |
return ShellCopy(directory, to_path, false); |
} |
+bool CopyAndDeleteDirectory(const FilePath& from_path, |
+ const FilePath& to_path) { |
+ if (CopyDirectory(from_path, to_path, true)) { |
+ if (Delete(from_path, true)) { |
+ return true; |
+ } |
+ // Like Move, this function is not transactional, so we just |
+ // leave the copied bits behind if deleting from_path fails. |
+ // If to_path exists previously then we have already overwritten |
+ // it by now, we don't get better off by deleting the new bits. |
+ } |
+ return false; |
+} |
+ |
+ |
bool PathExists(const FilePath& path) { |
return (GetFileAttributes(path.value().c_str()) != INVALID_FILE_ATTRIBUTES); |
} |