protected override void OnActivated() { base.OnActivated(); var objectSpaceCreated = Observable.FromEventPattern <DetailViewCreatedEventArgs>(h => Application.DetailViewCreated += h, h => Application.DetailViewCreated -= h) .Where(pattern => pattern.EventArgs.View.ObjectTypeInfo.Type == typeof(ExcelImport)) .Select(pattern => pattern.EventArgs.View.ObjectSpace); var modifiedExcelImports = objectSpaceCreated .SelectMany(space => Observable.FromEventPattern <CancelEventArgs>(h => space.Committing += h, h => space.Committing -= h) .SelectMany(pattern => ((IObjectSpace)pattern.Sender).ModifiedObjects.OfType <ExcelImport>())) .Where(import => { if (CanAutoImport(import)) { if (!_fileDropWatchers.ContainsKey(import.Oid)) { _fileDropWatchers.Add(import.Oid, null); return(true); } } else { if (_fileDropWatchers.ContainsKey(import.Oid)) { StopWatching(import); } } return(false); }).Delay(TimeSpan.FromSeconds(5)); objectSpaceCreated .SelectMany(space => Observable.FromEventPattern <ObjectsManipulatingEventArgs>(h => space.ObjectDeleted += h, h => space.ObjectDeleted -= h) .SelectMany(pattern => pattern.EventArgs.Objects.OfType <ExcelImport>())) .Subscribe(import => { if (_fileDropWatchers.ContainsKey(import.Oid)) { StopWatching(import); } }); var objectSpace = Application.CreateObjectSpace(); var existingExcelImports = objectSpace.GetObjectsQuery <ExcelImport>() .ToArray() .Where(CanAutoImport) .ToObservable() .Do(import => _fileDropWatchers.Add(import.Oid, null)); existingExcelImports.Merge(modifiedExcelImports) .Subscribe(import => { var fileDropWatcher = new FileDropWatcher(GetFullPath(import), import.AutoImportRegex, import.AutoImportSearchType); _fileDropWatchers[import.Oid] = fileDropWatcher; fileDropWatcher.Start(); fileDropWatcher.Dropped.ObserveOn(Scheduler.Default).Subscribe(dropped => Import(dropped, (import.Oid, fileDropWatcher))); fileDropWatcher.PollExisting(); }); }
public async Task PollExisting_FileBeforeStart_StreamsDropped() { using (var watcher = new FileDropWatcher(TempPath, "Monitored.Txt")) { var firstDropped = watcher.Dropped.FirstAsync().ToTask(); var monitoredFile = Path.Combine(TempPath, "Monitored.Txt"); File.WriteAllText(monitoredFile, "foo"); watcher.PollExisting(); var dropped = await firstDropped; Assert.That(dropped.Name, Is.EqualTo("Monitored.Txt")); Assert.That(dropped.FullPath, Is.EqualTo(monitoredFile)); } }
public async Task FileDropped_NoExistingFile_StreamsDropped() { using (var watcher = new FileDropWatcher(TempPath, "Monitored.Txt")) { var firstDropped = watcher.Dropped.FirstAsync().ToTask(); watcher.Start(); var monitoredFile = Path.Combine(TempPath, "Monitored.Txt"); File.WriteAllText(monitoredFile, "foo"); var dropped = await firstDropped; Assert.Equal("Monitored.Txt", dropped.Name); Assert.Equal(monitoredFile, dropped.FullPath); } }
public async Task PollExisting_SecondTime_StreamsSecondTime() { using (var watcher = new FileDropWatcher(TempPath, "Monitored.Txt")) { var secondDropped = watcher.Dropped.Skip(1).FirstAsync().ToTask(); var monitoredFile = Path.Combine(TempPath, "Monitored.Txt"); File.WriteAllText(monitoredFile, "foo"); watcher.PollExisting(); watcher.PollExisting(); var dropped = await secondDropped; Assert.That(dropped.Name, Is.EqualTo("Monitored.Txt")); Assert.That(dropped.FullPath, Is.EqualTo(monitoredFile)); } }
public async Task Overwrite_ExistingFile_StreamsDropped() { using (var watcher = new FileDropWatcher(TempPath, "Monitored.Txt")) { var firstDropped = watcher.Dropped.FirstAsync().ToTask(); var monitoredFile = Path.Combine(TempPath, "Monitored.Txt"); File.WriteAllText(monitoredFile, "foo"); watcher.Start(); File.WriteAllText(monitoredFile, "bar"); var dropped = await firstDropped; Expect(dropped.Name, Is.EqualTo("Monitored.Txt")); Expect(dropped.FullPath, Is.EqualTo(monitoredFile)); } }
public async Task FileRenamed_NoExistingFile_StreamsDropped() { using (var watcher = new FileDropWatcher(TempPath, "Monitored.Txt")) { var firstDropped = watcher.Dropped.FirstAsync().ToTask(); var otherFile = Path.Combine(TempPath, "Other.Txt"); File.WriteAllText(otherFile, "foo"); watcher.Start(); var monitoredFile = Path.Combine(TempPath, "Monitored.Txt"); File.Move(otherFile, monitoredFile); var dropped = await firstDropped; Assert.That(dropped.Name, Is.EqualTo("Monitored.Txt")); Assert.That(dropped.FullPath, Is.EqualTo(monitoredFile)); } }
public static async Task Main(string[] args) { var cts = new CancellationTokenSource(); Console.CancelKeyPress += (s, e) => { cts.Cancel(); }; var rxWatcher = new FileDropWatcher(@".", "*.txt"); rxWatcher.Dropped.Subscribe(droppedFiled => { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($"{droppedFiled.DroppedType} \t {droppedFiled.Name}"); Console.ForegroundColor = ConsoleColor.Gray; }, ex => { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error happened while watching :{ex.Message}"); Console.ForegroundColor = ConsoleColor.Gray; }, () => { Console.ForegroundColor = ConsoleColor.DarkYellow; Console.WriteLine($"Done watching ..."); Console.ForegroundColor = ConsoleColor.Gray; }, cts.Token); rxWatcher.Start(); rxWatcher.PollExisting(); while (!cts.IsCancellationRequested) { try { await Task.Delay(500, cts.Token); if (!File.Exists("foobar.txt")) { File.Create("foobar.txt"); } else { Console.WriteLine("Writing to file ..."); await File.AppendAllTextAsync("foobar.txt", $"{DateTime.Now.ToLongTimeString()}\r\n", cts.Token); } } catch { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Could not write to file ..."); Console.ForegroundColor = ConsoleColor.Gray; } } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Stopping watcher ..."); Console.ForegroundColor = ConsoleColor.Gray; rxWatcher.Stop(); }