public bool AnyChanges(FsSyncInfo syncInfo)
        {
            if (string.IsNullOrEmpty(syncInfo.Filters))
                syncInfo.Filters = "*";
            var fs = GetFileSystemEntries(syncInfo.Source, syncInfo.Filters, SearchOption.AllDirectories);
            foreach (var item in fs)
            {
                if (IsExcludedFromSync(item, syncInfo.Excludes.Split(','))) continue;
                if ((File.GetAttributes(item) & FileAttributes.Directory) == FileAttributes.Directory)
                {
                    var destinationFolder = item.Replace(syncInfo.Source, syncInfo.Target);
                    if (!Directory.Exists(destinationFolder))
                        return true;
                }
                else
                {
                    var destinationFile = item.Replace(syncInfo.Source, syncInfo.Target);
                    if (!File.Exists(destinationFile) || !AreTheyTheSameFile(item, destinationFile))
                        return true;
                }

            }

            if (!Directory.Exists(syncInfo.Target))
                return false;

            var fsEntries = GetFileSystemEntries(syncInfo.Target, syncInfo.Filters, SearchOption.AllDirectories);
            foreach (var item in fsEntries)
            {
                if (IsExcludedFromSync(item, syncInfo.Excludes.Split(','))) continue;
                try
                {
                    if ((File.GetAttributes(item) & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        var sourceFolder = item.Replace(syncInfo.Target, syncInfo.Source);
                        if (!Directory.Exists(sourceFolder))
                            return true;
                    }
                    else
                    {
                        var sourceFile = item.Replace(syncInfo.Target, syncInfo.Source);
                        if (!File.Exists(sourceFile))
                            return true;
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                }

            }

            //if (doPurge)
            //    RemoveRedundantFiles(source, target, filters, excludes);
            return false;
        }
        public void ShouldRunFileSystemSyncWhenStarted()
        {
            //Arrange
            var isOnRunStartRaised = false;
            var isRunCompleteRaised = false;
            var syncInfo = new FsSyncInfo {Source = "A", Target = "B"};
            var oneWaySynchronizerMock = new Mock<IOneWaySynchronizer>();
            oneWaySynchronizerMock.Setup(x => x.Run(syncInfo));

            //Act
            var fileSystemSyncWhenStartup = new FileSystemSyncWhenStartup(oneWaySynchronizerMock.Object) { Name = "TestWhenStarted", SyncInfo = syncInfo };
            fileSystemSyncWhenStartup.OnRunStart += name => { isOnRunStartRaised = true; };
            fileSystemSyncWhenStartup.OnRunComplete += name => { isRunCompleteRaised = true; };
            fileSystemSyncWhenStartup.Start();

            //Assert
            Assert.IsTrue(isOnRunStartRaised);
            Assert.IsTrue(isRunCompleteRaised);
            oneWaySynchronizerMock.Verify(x => x.Run(syncInfo));
        }
 public void Run(FsSyncInfo syncInfo)
 {
     if (string.IsNullOrEmpty(syncInfo.Filters))
         syncInfo.Filters = "*";
     SynchronizeDirectory(syncInfo.Source, syncInfo.Target, syncInfo.Filters, syncInfo.Excludes);
     if (syncInfo.DoPurge)
         RemoveRedundantFiles(syncInfo.Source, syncInfo.Target, syncInfo.Filters, syncInfo.Excludes);
 }