Kaynağa Gözat

Bug 1395: When FTP server does not provide precise timestamp, but the timestamp otherwise matches timestamp of the last uploaded version of the file, using precise timestamp of the uploaded version instead

https://winscp.net/tracker/1395

Source commit: 826551d8f310d264718d925ee305247982ebaebb
Martin Prikryl 10 yıl önce
ebeveyn
işleme
68dae07d6e
2 değiştirilmiş dosya ile 28 ekleme ve 0 silme
  1. 26 0
      source/core/FtpFileSystem.cpp
  2. 2 0
      source/core/FtpFileSystem.h

+ 26 - 0
source/core/FtpFileSystem.cpp

@@ -1987,6 +1987,11 @@ void __fastcall TFTPFileSystem::Source(const UnicodeString FileName,
          ((FServerCapabilities->GetCapability(mdtm_command) == yes))))
     {
       TTouchSessionAction TouchAction(FTerminal->ActionLog, DestFullName, Modification);
+
+      if (!FFileZillaIntf->UsingMlsd())
+      {
+        FUploadedTimes[DestFullName] = Modification;
+      }
     }
 
     FTerminal->LogFileDone(OperationProgress);
@@ -4487,6 +4492,27 @@ bool __fastcall TFTPFileSystem::HandleListData(const wchar_t * Path,
         TDateTime Modification;
         TModificationFmt ModificationFmt;
         RemoteFileTimeToDateTimeAndPrecision(Entry->Time, Modification, ModificationFmt);
+
+        if (ModificationFmt != mfFull)
+        {
+          UnicodeString FullPath = UnixIncludeTrailingBackslash(Path) + File->FileName;
+          TUploadedTimes::iterator Iterator = FUploadedTimes.find(FullPath);
+          if (Iterator != FUploadedTimes.end())
+          {
+            TDateTime UploadModification = Iterator->second;
+            TDateTime UploadModificationReduced = ReduceDateTimePrecision(UploadModification, ModificationFmt);
+            if (UploadModificationReduced == Modification)
+            {
+              Modification = UploadModification;
+              ModificationFmt = mfFull;
+            }
+            else
+            {
+              FUploadedTimes.erase(Iterator);
+            }
+          }
+        }
+
         File->Modification = Modification;
         File->ModificationFmt = ModificationFmt;
         File->LastAccess = File->Modification;

+ 2 - 0
source/core/FtpFileSystem.h

@@ -268,6 +268,8 @@ private:
   std::unique_ptr<TStrings> FSupportedCommands;
   std::unique_ptr<TStrings> FSupportedSiteCommands;
   std::unique_ptr<TStrings> FHashAlgs;
+  typedef std::map<UnicodeString, TDateTime> TUploadedTimes;
+  TUploadedTimes FUploadedTimes;
   bool FSupportsAnyChecksumFeature;
   UnicodeString FLastCommandSent;
   X509 * FCertificate;