Обнаруживаемые изменения всегда обнаруживают изменения

#c# #microsoft-sync-framework

#c# #microsoft-sync-фреймворк #microsoft-sync-framework

Вопрос:

Я использую Microsoft SyncFramework 2.1.

Я синхронизирую удаленный исходный каталог с локальным каталогом назначения. Итак, если фреймворк обнаруживает изменения — он загружает изменения из источника (удаленного) в пункт назначения (локальный).

Но:

DetectChanges всегда обнаруживает изменения, но каталог не изменен.

Этот удаленный каталог содержит 1 файл.

Итак, я пишу код для его синхронизации:

  public class SyncService
{
  private FileSyncProvider _provider;    
  private FileSyncOptions _syncOptions;
  private FileSyncScopeFilter _filter;
  private string _toLocalDirPath;
  private string _fromSourceDirectory;
  private string _lastFromSourceDirectory; // save last directory (it can be changed);

  public SyncService(string localDirPath,string 
                  fromSourceDirectory)
 {
  _syncOptions = FileSyncOptions.ExplicitDetectChanges |
                FileSyncOptions.RecycleDeletedFiles | 
                FileSyncOptions.RecyclePreviousFileOnUpdates |
                 FileSyncOptions.RecycleConflictLoserFiles;
  _filter = new FileSyncScopeFilter();
 _toLocalDirPath=localDirPath;
 _fromSourceDirectory=fromSourceDirectory;
  }


 public void Sync()
 {
  if (_lastFromSourceDirectory !=Constants.FromSourceDirectory)  //if directory path changed - we should dispose old provider and create new
    {
  if (_provider != null)
     {
    _provider.DetectedChanges -= Provider_DetectedChanges;
    _provider.ApplyingChange -= Provider_ApplyingChange;
    _provider.AppliedChange -= Provider_AppliedChange;
    _provider.CopyingFile -= Provider_CopyingFile;
    _provider.SkippedChange -= Provider_SkippedChange;
    _provider.SkippedFileDetect -= Provider_SkippedFileDetect;
    _provider.Dispose();
     }
  }

   _provider = new FileSyncProvider(_lastFromSourceDirectory, _filter, 
    _syncOptions);
    _provider.DetectedChanges  = Provider_DetectedChanges;
    _provider.ApplyingChange  = Provider_ApplyingChange;
    _provider.AppliedChange  = Provider_AppliedChange;
    _provider.CopyingFile  = Provider_CopyingFile;
     _provider.SkippedChange  = Provider_SkippedChange;
     _provider.SkippedFileDetect  =Provider_SkippedFileDetect;

     DetectChangesOnFileSystemReplica();   

     SyncFileOneWay(_fromSourceDirectory, 
                     _toLocalDirPath,_filter,_syncOptions);       
   }


    private void DetectChangesOnFileSystemReplica()
    {                     
      _provider?.DetectChanges();         
    }

    private void SyncFileOneWay(
      string sourceRootPath, string desctinationRootPath,
      FileSyncScopeFilter filter, FileSyncOptions options)
    {            
        FileSyncProvider sourceProvider = null;
        FileSyncProvider destinationProvider = null;

        try
        {

            sourceProvider = new FileSyncProvider(
                sourceRootPath, filter, options);                             

            destinationProvider = new FileSyncProvider(
                desctinationRootPath, filter, options);

            SyncOrchestrator agent = new SyncOrchestrator();
            agent.LocalProvider = destinationProvider;
            agent.RemoteProvider = sourceProvider;
            agent.Direction = SyncDirectionOrder.Download; // 
     Sync source to destination (download destination to local source)

            //agent.Direction = SyncDirectionOrder.Upload;
            var sourcePath = sourceProvider.RootDirectoryPath.TrimEnd('\');
            var destinationPath = destinationProvider.RootDirectoryPath.TrimEnd('\');                                                
            agent.Synchronize(); //sync                
        }
        finally
        {   // Release resources
            if (sourceProvider != null)
            {                   
                sourceProvider.Dispose();
            }
            if (destinationProvider != null)
            {                 
                destinationProvider.Dispose();
            }               
        }
    }

   private void Provider_DetectedChanges(object sender, DetectedChangesEventArgs e)
    {                                
     Console.WriteLine($"{nameof(e.TotalFileSize)}:{e.TotalFileSize}");
    }
 }
  

Итак, я запускаю Sync() метод каждые 5 минут и DetectChanges() сообщает, что он обнаружил изменения.
И затем это синхронизируется.

Итак, почему метод DetectChanges обнаруживает изменения, если я не изменяю файл или каталог? Это удаленный каталог.

Я хочу синхронизировать каталоги только в том случае, если в удаленном каталоге действительно есть какие-то изменения.

Ответ №1:

Итак, я исследовал этот вопрос и понял, что после получения команды для синхронизации провайдер синхронизирует то, что необходимо, и не передает данные.