public async Task Watch(string verzeichnis, int pollingIntervallInMilliseconds) { while (true) { var newFiles = Enumerable.Empty <WatchedFile>(); try { newFiles = GetDirectoryFiles(verzeichnis); } catch (Exception e) { Trace.TraceError("Fehler {0}, {1}, {2}", DateTime.Now, e.Message, e.StackTrace); } var watchedFiles = new WatchedFiles(_files); // Datei erstellt ExecuteStrategy(() => watchedFiles.GetCreatedFiles(newFiles), Alphabet.CREATE); // Datei geupdated ExecuteStrategy(() => watchedFiles.GetUpdatedFiles(newFiles), Alphabet.MODIFY); // Datei gelöscht ExecuteStrategy(() => watchedFiles.GetDeletedFiles(newFiles), Alphabet.DELETE); _files = newFiles; await Task.Delay(pollingIntervallInMilliseconds); } }
private void OnFileWatcherCreated(object sender, FileSystemEventArgs e) { mutex.WaitOne(); string path = e.FullPath; string name = System.IO.Path.GetFileName(path); int index = ExpectingFiles.IndexOf(path); if (index >= 0) { ExpectingFiles.RemoveAt(index); WatchedFiles.Add(path); ItemAdded?.Invoke(this, new WatchingItemEventArgs(ItemType.File, path, name)); } else { foreach (DirectoryScanOptions scanOptions in ScanOptions) { if (scanOptions.IsIncluded(name, path, ItemType.File)) { ItemAdded?.Invoke(this, new WatchingItemEventArgs(ItemType.File, path, name)); break; } } } mutex.Set(); }
public void GetDeletedFiles_WhenCalled_ReturnsTrue() { var oldFiles = GetRandomFiles(2); var changedFiles = oldFiles.Take(1).ToList(); var diff = new WatchedFiles(oldFiles).GetDeletedFiles(changedFiles); Assert.Single(diff); Assert.Equal(diff.Single(), oldFiles.Last()); }
public void GetCreatedFiles_WhenCalled_ReturnsTrue() { var oldFiles = GetRandomFiles(1); var changedFiles = oldFiles.Concat(GetRandomFiles(1)); var diff = new WatchedFiles(oldFiles).GetCreatedFiles(changedFiles); Assert.Single(diff); Assert.Equal(diff.Single(), changedFiles.Last()); }
private void UnWatchDocumentForChanges(string fullFilePath, Action <object, FileSystemEventArgs> onChangedAction) { if (WatchedFiles.ContainsKey(fullFilePath)) { WatchedFiles[fullFilePath].Changed -= onChangedAction.Invoke; WatchedFiles[fullFilePath].EnableRaisingEvents = false; WatchedFiles[fullFilePath].Dispose(); WatchedFiles.Remove(fullFilePath); } }
public void GetUpdatedFiles_WhenCalled_ReturnsTrue() { var oldFiles = GetRandomFiles(2); var clones = oldFiles.Take(1).Select(f => Clone(f)).ToList(); clones.ForEach(c => c.ZeitStempel = DateTime.Now); var diff = new WatchedFiles(oldFiles).GetUpdatedFiles(clones); Assert.Single(diff); }
private void OnFileWatcherRenamed(object sender, RenamedEventArgs e) { mutex.WaitOne(); string removedPath = e.OldFullPath; string removedName = System.IO.Path.GetFileName(removedPath); string addedPath = e.FullPath; string addedName = System.IO.Path.GetFileName(addedPath); int index = WatchedFiles.IndexOf(removedPath); if (index >= 0) { WatchedFiles.RemoveAt(index); ExpectingFiles.Add(removedPath); ItemRemoved?.Invoke(this, new WatchingItemEventArgs(ItemType.File, removedPath, removedName)); } else { foreach (DirectoryScanOptions scanOptions in ScanOptions) { if (scanOptions.IsIncluded(removedName, removedPath, ItemType.File)) { ItemRemoved?.Invoke(this, new WatchingItemEventArgs(ItemType.File, removedPath, removedName)); break; } } } index = ExpectingFiles.IndexOf(addedPath); if (index >= 0) { ExpectingFiles.RemoveAt(index); WatchedFiles.Add(addedPath); ItemAdded?.Invoke(this, new WatchingItemEventArgs(ItemType.File, addedPath, addedName)); } else { foreach (DirectoryScanOptions scanOptions in ScanOptions) { if (scanOptions.IsIncluded(addedName, addedPath, ItemType.File)) { ItemAdded?.Invoke(this, new WatchingItemEventArgs(ItemType.File, addedPath, addedName)); break; } } } mutex.Set(); }
private void WatchDocumentForChanges(string fullFilePath, Action <object, FileSystemEventArgs> onChangedAction) { if (!WatchedFiles.ContainsKey(fullFilePath)) { var fsw = new FileSystemWatcher(); fsw.BeginInit(); fsw.Path = Path.GetDirectoryName(fullFilePath); fsw.Filter = Path.GetFileName(fullFilePath); fsw.IncludeSubdirectories = false; fsw.NotifyFilter = NotifyFilters.LastWrite; fsw.Changed += onChangedAction.Invoke; fsw.EnableRaisingEvents = true; fsw.EndInit(); WatchedFiles.Add(fullFilePath, fsw); } }