Я дублирую некоторые функции, подобные SyncToy, для управления репликацией данных. Цель - синхронизация в стиле Contribute , где CREATEs, CHANGEs и RENAMEs в «левой» папке реплицируются в «правую» папку, но не удаляются.
Используя Sync Framework 2.1 SDK, я могу успешно реплицировать C: \ FolderLeft в C: \ FolderRight , и это все хорошо.
Однако, если я удаляю файл в C: \ FolderRight , он не синхронизируется снова при последующих запусках. (!!)
Я понимаю, что это из-за того, что Sync Framework отслеживает, что он уже скопировал этот файл один раз, и он должен быть там, но мы должны спроектировать так, чтобы обезьяна Хаоса попала в C: \ FolderRight и удалила материал .
Итак, как я могу сказать Sync Framework проверить, а не предполагать, что файл уже синхронизирован?
Текущий код для синхронизации, в основном взят из примера кода MSDN:
public void SyncFileSystemReplicasOneWay(
string sourceReplicaRootPath, string destinationReplicaRootPath,
FileSyncScopeFilter filter, FileSyncOptions options)
{
FileSyncProvider sourceProvider = null;
FileSyncProvider destinationProvider = null;
try
{
// Instantiate source and destination providers, with a null filter (the filter
// was specified in DetectChangesOnFileSystemReplica()), and options for both.
Log("Initializing replicas from " + sourceReplicaRootPath + " to " + destinationReplicaRootPath);
sourceProvider = new FileSyncProvider(
sourceReplicaRootPath, filter, options);
destinationProvider = new FileSyncProvider(
destinationReplicaRootPath, filter, options);
Log("Synchronizing changes from " + sourceProvider.RootDirectoryPath + " to replica: " +
destinationProvider.RootDirectoryPath);
// Register event handlers so that we can write information
// to the console.
destinationProvider.AppliedChange +=
new EventHandler<AppliedChangeEventArgs>(OnAppliedChange);
destinationProvider.SkippedChange +=
new EventHandler<SkippedChangeEventArgs>(OnSkippedChange);
// Use SyncCallbacks for conflicting items.
SyncCallbacks destinationCallbacks = destinationProvider.DestinationCallbacks;
destinationCallbacks.ItemConflicting += new EventHandler<ItemConflictingEventArgs>(OnItemConflicting);
destinationCallbacks.ItemConstraint += new EventHandler<ItemConstraintEventArgs>(OnItemConstraint);
SyncOrchestrator agent = new SyncOrchestrator();
agent.LocalProvider = sourceProvider;
agent.RemoteProvider = destinationProvider;
agent.Direction = SyncDirectionOrder.Upload; // Upload changes from the source to the destination.
agent.Synchronize();
}
catch (Exception ex)
{
Log("EXCEPTION synchronizing from " + sourceProvider.RootDirectoryPath + " to " + destinationProvider.RootDirectoryPath + ": " + ex.Message);
}
finally
{
// Release resources.
if (sourceProvider != null) sourceProvider.Dispose();
if (destinationProvider != null) destinationProvider.Dispose();
}
}