public override void Build(IBounce bounce) { var fromPath = FromPath.Value; var toPath = _toPath.Value; bounce.Log.Debug("copying from: `{0}', to: `{1}'", fromPath, toPath); FileSystemCopier.Copy(fromPath, toPath, GetValueOf(Excludes), GetValueOf(Includes), DeleteToDirectory.Value); }
public void RunOperations(IList <SyncOperation> operations) { if (operations == null) { throw new ArgumentNullException("operations"); } try { int percentageProgress = 0; _log.InfoFormat("Running {0} operations.", operations.Count.ToString("#,0")); OnActionChanged("Performing sync ..."); // Delete file operations _log.Debug("Deleting files ..."); int allocatedPercentage = 5; var deleteFiles = operations.Where(o => o.OperationType == SyncOperationType.DeleteSource && o.IsFile).Select(o => o.Source.FullName).ToList(); deleteFiles.AddRange(operations.Where(o => o.OperationType == SyncOperationType.DeleteTarget && o.IsFile).Select(o => o.Target.FullName).ToList()); RunDeleteOperations(allocatedPercentage, percentageProgress, deleteFiles, true); percentageProgress += allocatedPercentage; // Delete directory operations _log.Debug("Deleting directories ..."); allocatedPercentage = 4; var deleteDirectories = operations.Where(o => o.OperationType == SyncOperationType.DeleteSource && !o.IsFile).Select(o => o.Source.FullName).ToList(); deleteDirectories.AddRange(operations.Where(o => o.OperationType == SyncOperationType.DeleteTarget && !o.IsFile).Select(o => o.Target.FullName).ToList()); RunDeleteOperations(allocatedPercentage, percentageProgress, deleteDirectories, false); percentageProgress += allocatedPercentage; // Create directories _log.Debug("Creating directories ..."); allocatedPercentage = 1; var createDirectories = operations.Where(o => (o.OperationType == SyncOperationType.CopyToSource || o.OperationType == SyncOperationType.CopyToTarget) && !o.IsFile).ToList(); for (var i = 0; i < createDirectories.Count; i++) { CheckStopped(); try { var sourceDirectory = (IDirectoryInfo)createDirectories[i].Source; var targetDirectory = (IDirectoryInfo)createDirectories[i].Target; if (createDirectories[i].OperationType == SyncOperationType.CopyToSource) { sourceDirectory = (IDirectoryInfo)createDirectories[i].Target; targetDirectory = (IDirectoryInfo)createDirectories[i].Source; } var actionName = string.Format("Creating directory {0}", createDirectories[i]); _log.Info(actionName); OnActionChanged(actionName); targetDirectory.Create(); targetDirectory.Attributes = sourceDirectory.Attributes; targetDirectory.LastWriteTime = sourceDirectory.LastWriteTime; } catch (Exception ex) { var message = string.Format("Error creating directory file {0}", createDirectories[i]); _log.Error(message); _log.Error(ex.Message, ex); OnErrorOccured(message, ex); } OnProgressChanged(percentageProgress + (i + 1) * allocatedPercentage / createDirectories.Count); } percentageProgress += allocatedPercentage; // Copy files _log.Debug("Copying files ..."); allocatedPercentage = 90; var copyFiles = operations.Where(o => (o.OperationType == SyncOperationType.CopyToTarget || o.OperationType == SyncOperationType.CopyToSource) && o.IsFile).ToList(); var copyToTargetFiles = copyFiles.Where(o => o.OperationType == SyncOperationType.CopyToTarget).ToList(); var copyToSourceFiles = copyFiles.Where(o => o.OperationType == SyncOperationType.CopyToSource).ToList(); BytesToCopy = copyToTargetFiles.Sum(o => o.Source.Size) + copyToSourceFiles.Sum(o => o.Target.Size); BytesCopied = 0; foreach (var operation in copyFiles) { CheckStopped(); string sourceFile, targetFile; long operationSize; if (operation.OperationType == SyncOperationType.CopyToTarget) { sourceFile = operation.Source.FullName; targetFile = operation.Target.FullName; operationSize = operation.Source.Size; } else { sourceFile = operation.Target.FullName; targetFile = operation.Source.FullName; operationSize = operation.Target.Size; } try { var actionName = string.Format("Copying {0} to {1}", sourceFile, targetFile); _log.Info(actionName); OnActionChanged(actionName); _fileSystemCopier.Copy(sourceFile, targetFile); } catch (Exception ex) { var message = string.Format("Error copying {0} to {1}", sourceFile, targetFile); _log.Error(message); _log.Error(ex.Message, ex); OnErrorOccured(message, ex); } BytesCopied += operationSize; if (BytesToCopy != 0) { OnProgressChanged(percentageProgress + (int)(BytesCopied * allocatedPercentage / BytesToCopy)); } } OnProgressChanged(100); } catch (StoppedException) { _log.Info("Operation stopped."); OnActionChanged("Stopped."); StopPending = false; } }