public bool Open(FilterAndCallbackArgument callbackAndFilter) { Stop(); Trace.TraceInformation($"Open directory for scanning: {_settings.ScanDirectory} - scanning period: {_settings.ScanSpeedInSeconds} seconds"); _tokenSource = new CancellationTokenSource(); _currentFileSystemWatcher = Task.Factory.StartNew( async() => await PeriodicallyScanDirectory(_tokenSource.Token, callbackAndFilter), TaskCreationOptions.LongRunning).Result; return(true); }
public void FileList_StartWatching_ChangeFilesCheckState() { FilterAndCallbackArgument local = null; var a = new Action <FilterAndCallbackArgument>(arg => { local = arg; }); FileEntry lastEntry = new FileEntry(); var lc = new Action <FileListType>(list => { foreach (var e in list) { lastEntry = e; Debug.WriteLine($"{e.FileName}: {e.LastChanges}"); } }); Mock <IFileSystemWatcher> m = new Mock <IFileSystemWatcher>(); m.Setup(x => x.Open(It.IsAny <FilterAndCallbackArgument>())).Callback((FilterAndCallbackArgument arg) => { if (arg == null) { throw new ArgumentNullException(nameof(arg)); } a(arg); }).Returns(true); WatcherFileList w = new WatcherFileList(new FileDirectoryWatcherSettings(), m.Object); w.Start(_ => lc(_)); CheckHelper(local, "f1.txt", ref lastEntry, FileSystemWatcherChangeType.Created); CheckHelper(local, "f2.txt", ref lastEntry, FileSystemWatcherChangeType.Changed); CheckHelper(local, "f3.txt", ref lastEntry, FileSystemWatcherChangeType.Deleted); CheckHelper(local, "f4.txt", ref lastEntry, FileSystemWatcherChangeType.Dispose); CheckHelper(local, "f5.txt", ref lastEntry, FileSystemWatcherChangeType.Error); CheckHelper(local, "f6.txt", ref lastEntry, FileSystemWatcherChangeType.Rename); CheckHelper(local, "f7.txt", ref lastEntry, FileSystemWatcherChangeType.All); // Shouldn't occur in productive environments w.Dispose(); }
private async Task PeriodicallyScanDirectory(CancellationToken token, FilterAndCallbackArgument callbackAndFilter) { try { int scanMs = _settings.ScanSpeedInSeconds * 1000; if (scanMs == 0) { scanMs = 100; } string scanDir = _settings.ScanDirectory; var current = _scanDirectory.Scan(scanDir); while (token.IsCancellationRequested == false) { try { await Task.Delay(scanMs, token); if (token.IsCancellationRequested) { break; } if (callbackAndFilter.ActionScanning != null) { callbackAndFilter.ActionScanning(this); } Trace.TraceInformation($"Scanning now directory: {_settings.ScanDirectory}"); var fileListNew = _scanDirectory.Scan(scanDir); ReportChanges(current, fileListNew, token, callbackAndFilter); current = fileListNew; } catch (Exception e) { Trace.TraceError($"Failed to scan directory: exception [{e.Message}]"); } } } catch (Exception e) { Trace.TraceError($"Failed to open scan directory: exception [{e.Message}]"); } }
void CheckHelper(FilterAndCallbackArgument local, string fileName, ref FileEntry lastEntry, IFileSystemWatcherChangeType ft) { local.ActionChanges(this, new WatcherCallbackArgs(fileName, ft)); Assert.True(lastEntry.FileName == fileName && lastEntry.LastChanges == ft); }
private void ReportChanges(FileList oldList, FileList newList, CancellationToken token, FilterAndCallbackArgument callbackAndFilter) { try { var report = callbackAndFilter.ActionChanges; var changed = _diffs.GetChangedFiles(oldList, newList); ReportChangeType(changed, token, report, FileSystemWatcherChangeType.Changed); var newFiles = _diffs.GetNewFiles(oldList, newList); ReportChangeType(newFiles, token, report, FileSystemWatcherChangeType.Created); var deletedFiles = _diffs.GetDeletedFiles(oldList, newList); ReportChangeType(deletedFiles, token, report, FileSystemWatcherChangeType.Deleted); } catch (OperationCanceledException) { throw; } catch (Exception) { // ignored } }