Un primo esempio di come realizzare una piccola applicazione che permette di sincronizzare 2 cartelle del file-system lo potete trovare qui.
Ora per rendere la cosa un po' più divertente e visto che in questo periodo mi sto guardando un IronRuby in vista della sessione di Ivan Porto Carrero alla prossima conferenza ugialtnet ho riscritto l'esempio appenda citato usano IronRuby. Questo il risultato
require "mscorlib"
require "Microsoft.Synchronization.dll"
require "Microsoft.Synchronization.Files.dll"
include System
include Microsoft::Synchronization
include Microsoft::Synchronization::Files
class Syncronizer
def DoWork replica1RootPath, replica2RootPath
idFileName = "filesync.id";
replica1Id = GetReplicaId( replica1RootPath + "/" + idFileName)
replica2Id = GetReplicaId( replica2RootPath + "/" + idFileName)
options = FileSyncOptions.RecycleDeletedFiles
filter = FileSyncScopeFilter.new
filter.FileNameExcludes.Add idFileName
DetectChangesOnFileSystemReplica replica1Id, replica1RootPath, filter, options
DetectChangesOnFileSystemReplica replica2Id, replica2RootPath, filter, options
SyncFileSystemReplicasOneWay replica1Id, replica2Id, replica1RootPath, replica2RootPath, filter, options
SyncFileSystemReplicasOneWay replica2Id, replica1Id, replica2RootPath, replica1RootPath, filter, options
end
def GetReplicaId path
id = Guid.NewGuid
if File.exist? path
str = File.read path
id = Guid.new(str)
else
File.open(path, 'w') {|f| f.write(id.ToString) }
end
id
end
def DetectChangesOnFileSystemReplica replicaId, rootPath, filter, options
provider = FileSyncProvider.new(replicaId, rootPath, filter, options)
provider.DetectChanges;
provider.Dispose
end
def SyncFileSystemReplicasOneWay sourceReplicaId, destinationReplicaId, sourceReplicaRootPath, destinationReplicaRootPath, filter, options
agent = SyncOrchestrator.new
agent.LocalProvider = FileSyncProvider.new(sourceReplicaId, sourceReplicaRootPath, filter, options)
agent.RemoteProvider = FileSyncProvider.new(destinationReplicaId, destinationReplicaRootPath, filter, options)
agent.Direction = SyncDirectionOrder.Upload
agent.Synchronize
end
end
sync = Syncronizer.new
sync.DoWork "D:/tmp/SyncFXSamples/A", "D:/tmp/SyncFXSamples/B"
Per il futuro, visto che gli esempi del Sync Framework non sono moltissimi, mi piacerebbe scrivere alcuni post per dimostrare come e quando questo framework può risolverci alcuni problemi non banali.
Ora devo spero di trovare il tempo per continuare.