private void SendChanges() { FileWatcherEventArgs args; lock (this) { args = _nextArgs; _nextArgs = null; } if (args != null && (args.NewFiles.Length > 0 || args.ChangedFiles.Length > 0 || args.DeletedFiles.Length > 0)) { OnChanged(args); } }
protected virtual void OnChanged(FileWatcherEventArgs args) { Changed?.Invoke(this, args); if (!string.IsNullOrEmpty(_setting.CallbackUrl)) { var request = WebRequest.Create(_setting.CallbackUrl); if (!string.IsNullOrEmpty(_setting.CallbackMethod)) { request.Method = _setting.CallbackMethod; } if (!request.Method.Equals("GET", StringComparison.InvariantCultureIgnoreCase)) { request.ContentType = "application/json"; var dataContractJsonSerializer = new DataContractJsonSerializer(args.GetType(), new DataContractJsonSerializerSettings { SerializeReadOnlyTypes = true }); using (var requestStream = request.GetRequestStream()) { dataContractJsonSerializer.WriteObject(requestStream, args); } } request.GetResponseAsync(); } }
void OnChanged(object source, FileSystemEventArgs e) { if (!string.IsNullOrWhiteSpace(_setting.SearchRegExPattern)) { if (!Regex.IsMatch(e.Name, _setting.SearchRegExPattern)) { return; } } lock (this) { if (_nextArgs == null) { _nextArgs = new FileWatcherEventArgs() { ChangedFiles = new string[0], DeletedFiles = new string[0], NewFiles = new string[0] } } ; if ((e.ChangeType & WatcherChangeTypes.Created) == WatcherChangeTypes.Created || (e.ChangeType & WatcherChangeTypes.Renamed) == WatcherChangeTypes.Renamed) { if (e is RenamedEventArgs renamedEventArgs) { if (_nextArgs.NewFiles.Contains(renamedEventArgs.OldFullPath)) { _nextArgs.NewFiles = _nextArgs.NewFiles.Where(n => n != renamedEventArgs.OldFullPath).ToArray(); // Delete from new files } if (_nextArgs.ChangedFiles.Contains(renamedEventArgs.OldFullPath)) { _nextArgs.ChangedFiles = _nextArgs.ChangedFiles.Where(n => n != renamedEventArgs.OldFullPath).ToArray(); // Delete from changed files } if (_setting.NotifiyDelete) { _nextArgs.DeletedFiles = _nextArgs.DeletedFiles.Concat(new string[] { renamedEventArgs.OldFullPath }).Distinct().ToArray(); } } if (_nextArgs.DeletedFiles.Contains(e.FullPath)) { _nextArgs.DeletedFiles = _nextArgs.DeletedFiles.Where(n => n != e.FullPath).ToArray(); // Delete from deleted files } _nextArgs.NewFiles = _nextArgs.NewFiles.Concat(new string[] { e.FullPath }).Distinct().ToArray(); } if ((e.ChangeType & WatcherChangeTypes.Changed) == WatcherChangeTypes.Changed) { if (!_nextArgs.NewFiles.Contains(e.FullPath)) { _nextArgs.ChangedFiles = _nextArgs.ChangedFiles.Concat(new string[] { e.FullPath }).Distinct().ToArray(); } } if ((e.ChangeType & WatcherChangeTypes.Deleted) == WatcherChangeTypes.Deleted) { bool wasNew = false; if (_nextArgs.NewFiles.Contains(e.FullPath)) { _nextArgs.NewFiles = _nextArgs.NewFiles.Where(n => n != e.FullPath).ToArray(); // Delete from new files wasNew = true; } if (_nextArgs.ChangedFiles.Contains(e.FullPath)) { _nextArgs.ChangedFiles = _nextArgs.ChangedFiles.Where(n => n != e.FullPath).ToArray(); // Delete from changed files } if (!wasNew) { _nextArgs.DeletedFiles = _nextArgs.DeletedFiles.Concat(new string[] { e.FullPath }).Distinct().ToArray(); } } if (_setting.DelayInMS > 0 || _setting.DelayInMS == null) { if (_changeTimer == null) { _changeTimer = new Timer(); _changeTimer.Interval = _setting.DelayInMS ?? 500; _changeTimer.AutoReset = false; _changeTimer.Elapsed += _changeTimer_Elapsed; _changeTimer.Start(); } } } if (_setting.DelayInMS <= 0) { SendChanges(); } }