ПКРПСиБД_ЛАБ10_СтепнаяЕВ (548541), страница 2
Текст из файла (страница 2)
Синхронизация двух реплик
После задания параметров и фильтров приложение синхронизирует эти две реплики, создавая экземпляр объекта SyncOrchestrator и вызывая метод Synchronize. В следующем примере кода показано, как указать поставщика для каждой реплики, задать параметры, зарегистрировать обработчики событий, указать направление синхронизации Upload и вызвать метод Synchronize. Для выполнения двунаправленной синхронизации реплик этот метод вызывается дважды.
Пример
Пусть есть две папки.
Содержание первой папки:
Папака «Новая папка» пуста
Содержание второй папки:
Синхронизуем папки:
Содержание папки first:
Содержание папки second:
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Files;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string replica1RootPath = "D:\\first";
string replica2RootPath = "D:\\second";
try
{
FileSyncOptions options = FileSyncOptions.ExplicitDetectChanges |
FileSyncOptions.RecycleDeletedFiles | FileSyncOptions.RecyclePreviousFileOnUpdates |
FileSyncOptions.RecycleConflictLoserFiles;
FileSyncScopeFilter filter = new FileSyncScopeFilter();
filter.FileNameExcludes.Add("*.lnk");
DetectChangesOnFileSystemReplica(
replica1RootPath, filter, options);
DetectChangesOnFileSystemReplica(
replica2RootPath, filter, options);
SyncFileSystemReplicasOneWay(replica1RootPath, replica2RootPath, null, options);
SyncFileSystemReplicasOneWay(replica2RootPath, replica1RootPath, null, options);
}
catch (Exception e)
{
Console.WriteLine("\nПолучено исключение от File Sync Provider:\n" + e.ToString());
}
Console.ReadLine();
}
public static void DetectChangesOnFileSystemReplica(
string replicaRootPath,
FileSyncScopeFilter filter, FileSyncOptions options)
{
FileSyncProvider provider = null;
try
{
provider = new FileSyncProvider(replicaRootPath, filter, options);
provider.DetectChanges();
}
finally
{
if (provider != null)
provider.Dispose();
}
}
public static void SyncFileSystemReplicasOneWay(
string sourceReplicaRootPath, string destinationReplicaRootPath,
FileSyncScopeFilter filter, FileSyncOptions options)
{
FileSyncProvider sourceProvider = null;
FileSyncProvider destinationProvider = null;
try
{
sourceProvider = new FileSyncProvider(
sourceReplicaRootPath, filter, options);
destinationProvider = new FileSyncProvider(
destinationReplicaRootPath, filter, options);
destinationProvider.AppliedChange +=
new EventHandler
destinationProvider.SkippedChange +=
new EventHandler
SyncCallbacks destinationCallbacks = destinationProvider.DestinationCallbacks;
destinationCallbacks.ItemConflicting += new EventHandler
destinationCallbacks.ItemConstraint += new EventHandler
SyncOrchestrator agent = new SyncOrchestrator();
agent.LocalProvider = sourceProvider;
agent.RemoteProvider = destinationProvider;
agent.Direction = SyncDirectionOrder.Upload; // Upload changes from the source to the destination.
Console.WriteLine("Синхронизация изменений в реплике: " +
destinationProvider.RootDirectoryPath);
agent.Synchronize();
}
finally
{
if (sourceProvider != null) sourceProvider.Dispose();
if (destinationProvider != null) destinationProvider.Dispose();
}
}
public static void OnAppliedChange(object sender, AppliedChangeEventArgs args)
{
switch (args.ChangeType)
{
case ChangeType.Create:
Console.WriteLine("-- Создан файл " + args.NewFilePath);
break;
case ChangeType.Delete:
Console.WriteLine("-- Удален файл " + args.OldFilePath);
break;
case ChangeType.Update:
Console.WriteLine("-- Обновлен файл " + args.OldFilePath);
break;
case ChangeType.Rename:
Console.WriteLine("-- Переименован файл " + args.OldFilePath +
" " + args.NewFilePath);
break;
}
}
public static void OnSkippedChange(object sender, SkippedChangeEventArgs args)
{
Console.WriteLine("-- Изменения пропущены " + args.ChangeType.ToString().ToUpper()
+ " для " + (!string.IsNullOrEmpty(args.CurrentFilePath) ?
args.CurrentFilePath : args.NewFilePath) + " due to error");
if (args.Exception != null)
Console.WriteLine(" [" + args.Exception.Message + "]");
}
public static void OnItemConflicting(object sender, ItemConflictingEventArgs args)
{
args.SetResolutionAction(ConflictResolutionAction.SourceWins);
Console.WriteLine("-- Конфликт " + args.DestinationChange.ItemId.ToString());
}
public static void OnItemConstraint(object sender, ItemConstraintEventArgs args)
{
args.SetResolutionAction(ConstraintConflictResolutionAction.SourceWins);
Console.WriteLine("-- Конфликт " + args.DestinationChange.ItemId.ToString());
}
}
}
Синхронизация баз данных
http://msdn.microsoft.com/ru-ru/library/ee617386.aspx