-
Notifications
You must be signed in to change notification settings - Fork 0
/
FileWatcher.cs
64 lines (50 loc) · 1.97 KB
/
FileWatcher.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using EnvDTE;
namespace FileIncluder
{
public class FileWatcher
{
public event ChangedHandler Changed;
public delegate void ChangedHandler(IncludeItem item);
private Dictionary<FileSystemWatcher, Project> _watchers = new Dictionary<FileSystemWatcher, Project>();
public FileWatcher(Solution solution)
{
foreach (var project in solution.Projects.Cast<Project>())
{
try
{
if (project.Properties == null) continue;
var p = (string) project.Properties.Item("FullPath").Value;
// check if it doesnt crash on getting items
if (project.ProjectItems == null) continue;
CreateWatcher(project, p);
}
catch {}
}
}
private void CreateWatcher(Project project, string folder)
{
var watcher = new FileSystemWatcher(folder, "*.cs");
watcher.Created += WatcherOnCreated;
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.EnableRaisingEvents = true;
watcher.IncludeSubdirectories = true;
_watchers.Add(watcher, project);
}
private void WatcherOnCreated(object sender, FileSystemEventArgs fileSystemEventArgs)
{
var project = _watchers[(FileSystemWatcher)sender];
foreach (ProjectItem projectItem in project.ProjectItems)
{
var fileName = projectItem.FileNames[0];
if (fileName == fileSystemEventArgs.FullPath)
return;
}
var item = new IncludeItem {Project = project.Name, ProjectId = project.UniqueName, File = fileSystemEventArgs.Name, FullPath = fileSystemEventArgs.FullPath};
if (Changed != null) Changed.Invoke(item);
}
}
}