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()}..."); }
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; } }
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"); } }