瀏覽代碼

Bug 1765: Retry deleting fake temporary folder created when pasting remote files to Windows File Explorer

https://winscp.net/tracker/1765
(cherry picked from commit f53ebe615c05626472d22f9825e714169dcc2646)

Source commit: df4e8f39efed3ca46e9d6bf1a67e66694e6b0801
Martin Prikryl 6 年之前
父節點
當前提交
d4d5e74e56
共有 1 個文件被更改,包括 17 次插入4 次删除
  1. 17 4
      source/forms/CustomScpExplorer.cpp

+ 17 - 4
source/forms/CustomScpExplorer.cpp

@@ -10247,15 +10247,28 @@ void __fastcall TCustomScpExplorerForm::ClipboardDownload(const UnicodeString &
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 void __fastcall TCustomScpExplorerForm::ClipboardFakeCreated(TObject * /*Sender*/, const UnicodeString FileName)
 void __fastcall TCustomScpExplorerForm::ClipboardFakeCreated(TObject * /*Sender*/, const UnicodeString FileName)
 {
 {
+  // It can actually rarelly happen that some random file is created, while we are shuttting down the monitor
+  // (as it pumps a Windows message queue while beign shutted down)
   if (DebugAlwaysTrue(!FClipboardFakeDirectory.IsEmpty()) &&
   if (DebugAlwaysTrue(!FClipboardFakeDirectory.IsEmpty()) &&
       SameText(ExtractFileName(FileName), ExtractFileName(FClipboardFakeDirectory)))
       SameText(ExtractFileName(FileName), ExtractFileName(FClipboardFakeDirectory)))
   {
   {
-    RemoveDir(ApiPath(FileName));
+    // Can fail as it can be e.g. locked by AV, so we retry that later
+    bool Removed = RemoveDir(ApiPath(FileName));
 
 
-    if (!NonVisualDataModule->Busy)
+    try
     {
     {
-      bool NoConfirmation = (WinConfiguration->DDTransferConfirmation == asOff);
-      ClipboardDownload(ExtractFilePath(FileName), NoConfirmation, true);
+      if (!NonVisualDataModule->Busy)
+      {
+        bool NoConfirmation = (WinConfiguration->DDTransferConfirmation == asOff);
+        ClipboardDownload(ExtractFilePath(FileName), NoConfirmation, true);
+      }
+    }
+    __finally
+    {
+      if (!Removed)
+      {
+        RemoveDir(ApiPath(FileName));
+      }
     }
     }
   }
   }
 }
 }