Procházet zdrojové kódy

Commit cb021fe3 caused intermittent failures between deleting and renaming files

Source commit: d8bd54ee7854190988b8ea3d136b690672d32ee7
Martin Prikryl před 2 roky
rodič
revize
131e4c047a
1 změnil soubory, kde provedl 31 přidání a 22 odebrání
  1. 31 22
      source/core/Terminal.cpp

+ 31 - 22
source/core/Terminal.cpp

@@ -4726,37 +4726,46 @@ bool __fastcall TTerminal::DoRenameFile(
 
   if (Result)
   {
-    if (!IsCapable[fcMoveOverExistingFile] && !DontOverwrite)
+    // Prevent destroying TRemoteFile between delete and rename
+    BeginTransaction();
+    try
     {
-      if (!ExistenceKnown)
+      if (!IsCapable[fcMoveOverExistingFile] && !DontOverwrite)
       {
-        FileExists(AbsoluteNewName, &DuplicateFile);
-        DuplicateFileOwner.reset(DuplicateFile);
+        if (!ExistenceKnown)
+        {
+          FileExists(AbsoluteNewName, &DuplicateFile);
+          DuplicateFileOwner.reset(DuplicateFile);
+        }
+
+        if (DuplicateFile != NULL)
+        {
+          DoDeleteFile(AbsoluteNewName, DuplicateFile, 0);
+        }
       }
 
-      if (DuplicateFile != NULL)
+      TRetryOperationLoop RetryLoop(this);
+      do
       {
-        DoDeleteFile(AbsoluteNewName, DuplicateFile, 0);
+        TMvSessionAction Action(ActionLog, AbsolutePath(FileName, true), AbsoluteNewName);
+        try
+        {
+          DebugAssert(FFileSystem);
+          FFileSystem->RenameFile(FileName, File, NewName);
+        }
+        catch(Exception & E)
+        {
+          UnicodeString Message = FMTLOAD(Move ? MOVE_FILE_ERROR : RENAME_FILE_ERROR, (FileName, NewName));
+          RetryLoop.Error(E, Action, Message);
+        }
       }
+      while (RetryLoop.Retry());
+      Result = RetryLoop.Succeeded();
     }
-
-    TRetryOperationLoop RetryLoop(this);
-    do
+    __finally
     {
-      TMvSessionAction Action(ActionLog, AbsolutePath(FileName, true), AbsoluteNewName);
-      try
-      {
-        DebugAssert(FFileSystem);
-        FFileSystem->RenameFile(FileName, File, NewName);
-      }
-      catch(Exception & E)
-      {
-        UnicodeString Message = FMTLOAD(Move ? MOVE_FILE_ERROR : RENAME_FILE_ERROR, (FileName, NewName));
-        RetryLoop.Error(E, Action, Message);
-      }
+      EndTransaction();
     }
-    while (RetryLoop.Retry());
-    Result = RetryLoop.Succeeded();
   }
   return Result;
 }