Как я могу получить Sync Framework для сравнения второй папки для односторонней синхронизации файлов? - PullRequest
1 голос
/ 26 июля 2011

Я дублирую некоторые функции, подобные 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();
    }
}
...