示例#1
0
        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);
        }
示例#2
0
        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();
        }
示例#3
0
        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}]");
            }
        }
示例#4
0
 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);
 }
示例#5
0
 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
     }
 }