Example #1
0
        public FsListener(SynchronizationParameters synchronizationParameters, BlockingCollection <FsEvent> eventList)
        {
            this.synchronizationParameters = synchronizationParameters;
            this.eventList = eventList;

            fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = synchronizationParameters.getSrcPath();

            // Watch for changes LastWrite times, and
            // the renaming of files or directories.
            fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite
                                             | NotifyFilters.FileName
                                             | NotifyFilters.DirectoryName;

            fileSystemWatcher.InternalBufferSize    = 64 * 1024;
            fileSystemWatcher.IncludeSubdirectories = true;

            // Add event handlers.
            fileSystemWatcher.Changed += onChanged;
            fileSystemWatcher.Created += onChanged;
            fileSystemWatcher.Deleted += onChanged;
            fileSystemWatcher.Renamed += onRenamed;
            fileSystemWatcher.Error   += onError;

            // Begin watching.
            fileSystemWatcher.EnableRaisingEvents = true;

            Logger.log(Logger.Level.Info, $"Listening for changes in {synchronizationParameters.getSrcPath()}...");
        }
Example #2
0
        public CustomApplicationContext()
        {
            try
            {
                byte[]        jsonConfigurationUtf8Bytes = File.ReadAllBytes("configuration\\configuration.json");
                Configuration configuration = JsonSerializer.Deserialize <Configuration>(jsonConfigurationUtf8Bytes);

                bool configurationIsValid = true;

                foreach (Configuration.Synchronization synchronization in configuration.synchronizations)
                {
                    if (string.IsNullOrEmpty(synchronization.srcPath))
                    {
                        Logger.log(Logger.Level.Info, "A srcPath is null or empty. Please edit configuration.json to set a valid path.");
                        configurationIsValid = false;
                        break;
                    }
                    if (string.IsNullOrEmpty(synchronization.destPath))
                    {
                        Logger.log(Logger.Level.Info, "A destPath is null or empty. Please edit configuration.json to set a valid path.");
                        configurationIsValid = false;
                        break;
                    }
                }

                if (!configurationIsValid)
                {
                    throw new Exception("Invalid configuration");
                }

                if (!string.IsNullOrEmpty(configuration.logLevel))
                {
                    Logger.setLoglevel((Logger.Level)Enum.Parse(typeof(Logger.Level), configuration.logLevel, true));
                }

                isInError = false;

                greenIcon  = Icon.ExtractAssociatedIcon("resources\\green.ico");
                yellowIcon = Icon.ExtractAssociatedIcon("resources\\yellow.ico");
                redIcon    = Icon.ExtractAssociatedIcon("resources\\red.ico");

                windowsFormsSynchronizationContext = new WindowsFormsSynchronizationContext();

                // Initialize Tray Icon
                trayIcon                  = new NotifyIcon();
                trayIcon.Icon             = yellowIcon;
                trayIcon.Text             = "";
                trayIcon.ContextMenuStrip = new ContextMenuStrip();
                trayIcon.ContextMenuStrip.Items.Add("Show logs", null, onMenuShowLogs);
                trayIcon.ContextMenuStrip.Items.Add("-");
                trayIcon.ContextMenuStrip.Items.Add("Exit", null, onMenuExit);

                trayIcon.Visible = true;

                synchronizationParametersList = new List <SynchronizationParameters>();
                foreach (Configuration.Synchronization synchronization in configuration.synchronizations)
                {
                    Filter filter = null;

                    if (synchronization.filterPatterns == null)
                    {
                        filter = new Filter(synchronization.srcPath, configuration.globalFilterPatterns);
                    }
                    else
                    {
                        filter = new Filter(synchronization.srcPath, synchronization.filterPatterns);
                    }

                    SynchronizationParameters synchronizationParameters = new SynchronizationParameters(
                        synchronization.srcPath,
                        synchronization.destPath,
                        filter);

                    synchronizationParametersList.Add(synchronizationParameters);
                }

                Synchronizer synchronizer = new Synchronizer();
                onSynchronizing();
                foreach (SynchronizationParameters synchronizationParameters in synchronizationParametersList)
                {
                    synchronizer.synchronize(synchronizationParameters.getSrcPath(), synchronizationParameters.getDestPath(), synchronizationParameters.getFilter(), true);
                }
                BlockingCollection <FsEvent> eventList = new BlockingCollection <FsEvent>();
                foreach (SynchronizationParameters synchronizationParameters in synchronizationParametersList)
                {
                    fsListener = new FsListener(synchronizationParameters, eventList);
                }
                eventProcessor = new EventProcessor(eventList, synchronizer, this);
            }
            catch (Exception e)
            {
                clean();
                throw e;
            }
        }
Example #3
0
 public FsEvent(SynchronizationParameters synchronizationParameters)
 {
     this.synchronizationParameters = synchronizationParameters;
     timeStamp = Environment.TickCount64;
 }
        private void processEvent(FsEvent fsEvent)
        {
            SynchronizationParameters synchronizationParameters = fsEvent.getSynchronizationParameters();
            string srcPath  = synchronizationParameters.getSrcPath();
            string destPath = synchronizationParameters.getDestPath();
            Filter filter   = synchronizationParameters.getFilter();

            if (fsEvent.fileSystemEventArgs != null)
            {
                string srcEntry = fsEvent.fileSystemEventArgs.FullPath;

                if (!filter.isPathFiltered(srcEntry))
                {
                    string destEntry = srcEntry.Replace(srcPath, destPath);

                    Logger.log(Logger.Level.Debug, $"Event {fsEvent.fileSystemEventArgs.ChangeType} fileSystemEventArgs {srcEntry}");

                    switch (fsEvent.fileSystemEventArgs.ChangeType)
                    {
                    case WatcherChangeTypes.Deleted:
                    {
                        fileTools.remove(destEntry);
                        break;
                    }

                    case WatcherChangeTypes.Created:
                    {
                        fileTools.copy(srcEntry, destEntry, true, filter);
                        break;
                    }

                    case WatcherChangeTypes.Changed:
                    {
                        fileTools.copy(srcEntry, destEntry, false, filter);
                        break;
                    }
                    }
                }
                //Logger.log(Logger.Level.Info, $"File: {fsEvent.fileSystemEventArgs.FullPath} {fsEvent.fileSystemEventArgs.ChangeType}");
            }
            else if (fsEvent.renamedEventArgs != null)
            {
                string srcOldEntry = fsEvent.renamedEventArgs.OldFullPath;
                string srcNewEntry = fsEvent.renamedEventArgs.FullPath;

                bool oldIsFiltered = filter.isPathFiltered(srcOldEntry);
                bool newIsFiltered = filter.isPathFiltered(srcNewEntry);

                Logger.log(Logger.Level.Debug, $"Event renamedEventArgs {srcOldEntry} -> {srcNewEntry}");

                if (!oldIsFiltered && !newIsFiltered)
                {
                    string destOldEntry = srcOldEntry.Replace(srcPath, destPath);
                    string destNewEntry = srcNewEntry.Replace(srcPath, destPath);

                    fileTools.rename(destOldEntry, destNewEntry);
                }
                else if (oldIsFiltered && !newIsFiltered)
                {
                    string destNewEntry = srcNewEntry.Replace(srcPath, destPath);

                    bool doNextStep  = true;
                    bool isDirectory = false;

                    try
                    {
                        isDirectory = fileTools.isPathDirectory(srcNewEntry);
                    }
                    catch (Exception e) when(e is FileNotFoundException || e is DirectoryNotFoundException)
                    {
                        // The source no longer exists, do nothing
                        doNextStep = false;
                    }

                    if (doNextStep)
                    {
                        if (isDirectory)
                        {
                            synchronizer.synchronize(srcNewEntry, destNewEntry, filter, false);
                        }
                        else
                        {
                            try
                            {
                                fileTools.copyFile(srcNewEntry, destNewEntry);
                            }
                            catch (Exception e) when(e is FileNotFoundException || e is DirectoryNotFoundException)
                            {
                                // The source no longer exists, do nothing
                            }
                        }
                    }
                }
                else if (!oldIsFiltered && newIsFiltered)
                {
                    string destOldEntry = srcOldEntry.Replace(srcPath, destPath);
                    string destNewEntry = srcNewEntry.Replace(srcPath, destPath);

                    // Rename first because the src can be deleted before this point
                    // All next operations can be done using only the dest file/directory
                    fileTools.rename(destOldEntry, destNewEntry);
                    fileTools.remove(destNewEntry);
                }
                //Logger.log(Logger.Level.Info, $"File: {fsEvent.renamedEventArgs.OldFullPath} renamed to {fsEvent.renamedEventArgs.FullPath}");
            }
            else if (fsEvent.errorEventArgs != null)
            {
                //  Show that an error has been detected.
                Logger.log(Logger.Level.Info, $"The FileSystemWatcher has detected an error: {fsEvent.errorEventArgs.GetException().Message}");
                //  Give more information if the error is due to an internal buffer overflow.
                if (fsEvent.errorEventArgs.GetException().GetType() == typeof(InternalBufferOverflowException))
                {
                    //  This can happen if Windows is reporting many file system events quickly
                    //  and internal buffer of the  FileSystemWatcher is not large enough to handle this
                    //  rate of events. The InternalBufferOverflowException error informs the application
                    //  that some of the file system events are being lost.
                    Logger.log(Logger.Level.Info, $"The file system watcher experienced an internal buffer overflow: {fsEvent.errorEventArgs.GetException().Message}");
                }
            }
            else
            {
                Logger.log(Logger.Level.Info, "Unknown FsEvent type");
            }
        }