public IOperation Create(FileSystemWatcherEventArgs eventArgs, IFileSender fileSender)
        {
            IOperation result;

            switch (eventArgs.ChangeType)
            {
                case FileSystemWatcherChangeType.Renamed:
                {
                    result = this.CreateRenameOperation(eventArgs, fileSender);
                    break;
                }
                case FileSystemWatcherChangeType.Synchronize:
                {
                    result = this.CreateSynchronizeOperation(eventArgs, fileSender);
                    break;
                }
                default:
                {
                    result = this.CreateCopyOperation(eventArgs, fileSender);
                    break;
                }
            }

            return result;
        }
 private void OnFolderStateChanged(object sender, FileSystemWatcherEventArgs fileSystemWatcherEventArgs)
 {
     lock (_sync)
     {
         _operationQueue.Enqueue(fileSystemWatcherEventArgs);
         Monitor.Pulse(_sync);
     }
 }
        private IOperation CreateRenameOperation(FileSystemWatcherEventArgs eventArgs, IFileSender fileSender)
        {
            var renameArgs = eventArgs as FileSystemWatcherRenameEventArgs;
            if (renameArgs == null)
            {
                throw new ArgumentException("The operation is specified as 'Rename' but the actual arguments is different.");
            }

            return _renameOperationFactory.Invoke(renameArgs.OldName, renameArgs.Name, fileSender);
        }
        private string GetKey(FileSystemWatcherEventArgs watchArg)
        {
            var renameArgs = watchArg as FileSystemWatcherRenameEventArgs;
            if (renameArgs != null)
            {
                return renameArgs.OldPath;
            }

            return watchArg.FullPath;
        }
 private IOperation CreateSynchronizeOperation(FileSystemWatcherEventArgs eventArgs, IFileSender fileSender)
 {
     return _synchronizationOperationFactory.Invoke(eventArgs.FullPath, fileSender);
 }
 private IOperation CreateCopyOperation(FileSystemWatcherEventArgs eventArgs, IFileSender fileSender)
 {
     return _copyOperationFactory.Invoke(eventArgs.FullPath, fileSender);
 }