#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:
Итак, я исследовал этот вопрос и понял, что после получения команды для синхронизации провайдер синхронизирует то, что необходимо, и не передает данные.