using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading; namespace System.IO { /// Listens to the file system change notifications and raises events when a directory, or file in a directory, changes. /// 2 // Token: 0x02000116 RID: 278 [IODescription("")] [global::System.ComponentModel.DefaultEvent("Changed")] public class FileSystemWatcher : global::System.ComponentModel.Component, global::System.ComponentModel.ISupportInitialize { /// Initializes a new instance of the class. // Token: 0x060009E8 RID: 2536 RVA: 0x0001AF9C File Offset: 0x0001919C public FileSystemWatcher() { this.notifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastWrite; this.enableRaisingEvents = false; this.filter = "*.*"; this.includeSubdirectories = false; this.internalBufferSize = 8192; this.path = string.Empty; this.InitWatcher(); } /// Initializes a new instance of the class, given the specified directory to monitor. /// The directory to monitor, in standard or Universal Naming Convention (UNC) notation. /// The parameter is null. /// The parameter is an empty string ("").-or- The path specified through the parameter does not exist. // Token: 0x060009E9 RID: 2537 RVA: 0x0001AFEC File Offset: 0x000191EC public FileSystemWatcher(string path) : this(path, "*.*") { } /// Initializes a new instance of the class, given the specified directory and type of files to monitor. /// The directory to monitor, in standard or Universal Naming Convention (UNC) notation. /// The type of files to watch. For example, "*.txt" watches for changes to all text files. /// The parameter is null.-or- The parameter is null. /// The parameter is an empty string ("").-or- The path specified through the parameter does not exist. // Token: 0x060009EA RID: 2538 RVA: 0x0001AFFC File Offset: 0x000191FC public FileSystemWatcher(string path, string filter) { if (path == null) { throw new ArgumentNullException("path"); } if (filter == null) { throw new ArgumentNullException("filter"); } if (path == string.Empty) { throw new ArgumentException("Empty path", "path"); } if (!Directory.Exists(path)) { throw new ArgumentException("Directory does not exists", "path"); } this.enableRaisingEvents = false; this.filter = filter; this.includeSubdirectories = false; this.internalBufferSize = 8192; this.notifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastWrite; this.path = path; this.synchronizingObject = null; this.InitWatcher(); } /// Occurs when a file or directory in the specified is changed. /// 2 // Token: 0x1400001D RID: 29 // (add) Token: 0x060009EC RID: 2540 RVA: 0x0001B0B4 File Offset: 0x000192B4 // (remove) Token: 0x060009ED RID: 2541 RVA: 0x0001B0D0 File Offset: 0x000192D0 [IODescription("Occurs when a file/directory change matches the filter")] public event FileSystemEventHandler Changed; /// Occurs when a file or directory in the specified is created. /// 2 // Token: 0x1400001E RID: 30 // (add) Token: 0x060009EE RID: 2542 RVA: 0x0001B0EC File Offset: 0x000192EC // (remove) Token: 0x060009EF RID: 2543 RVA: 0x0001B108 File Offset: 0x00019308 [IODescription("Occurs when a file/directory creation matches the filter")] public event FileSystemEventHandler Created; /// Occurs when a file or directory in the specified is deleted. /// 2 // Token: 0x1400001F RID: 31 // (add) Token: 0x060009F0 RID: 2544 RVA: 0x0001B124 File Offset: 0x00019324 // (remove) Token: 0x060009F1 RID: 2545 RVA: 0x0001B140 File Offset: 0x00019340 [IODescription("Occurs when a file/directory deletion matches the filter")] public event FileSystemEventHandler Deleted; /// Occurs when the internal buffer overflows. /// 2 // Token: 0x14000020 RID: 32 // (add) Token: 0x060009F2 RID: 2546 RVA: 0x0001B15C File Offset: 0x0001935C // (remove) Token: 0x060009F3 RID: 2547 RVA: 0x0001B178 File Offset: 0x00019378 [global::System.ComponentModel.Browsable(false)] public event ErrorEventHandler Error; /// Occurs when a file or directory in the specified is renamed. /// 2 // Token: 0x14000021 RID: 33 // (add) Token: 0x060009F4 RID: 2548 RVA: 0x0001B194 File Offset: 0x00019394 // (remove) Token: 0x060009F5 RID: 2549 RVA: 0x0001B1B0 File Offset: 0x000193B0 [IODescription("Occurs when a file/directory rename matches the filter")] public event RenamedEventHandler Renamed; // Token: 0x060009F6 RID: 2550 RVA: 0x0001B1CC File Offset: 0x000193CC private void InitWatcher() { object obj = FileSystemWatcher.lockobj; lock (obj) { if (FileSystemWatcher.watcher == null) { string environmentVariable = Environment.GetEnvironmentVariable("MONO_MANAGED_WATCHER"); int num = 0; if (environmentVariable == null) { num = FileSystemWatcher.InternalSupportsFSW(); } bool flag = false; switch (num) { case 1: flag = DefaultWatcher.GetInstance(out FileSystemWatcher.watcher); break; case 2: flag = FAMWatcher.GetInstance(out FileSystemWatcher.watcher, false); break; case 3: flag = KeventWatcher.GetInstance(out FileSystemWatcher.watcher); break; case 4: flag = FAMWatcher.GetInstance(out FileSystemWatcher.watcher, true); break; case 5: flag = InotifyWatcher.GetInstance(out FileSystemWatcher.watcher, true); break; } if (num == 0 || !flag) { if (string.Compare(environmentVariable, "disabled", true) == 0) { NullFileWatcher.GetInstance(out FileSystemWatcher.watcher); } else { DefaultWatcher.GetInstance(out FileSystemWatcher.watcher); } } } } } // Token: 0x060009F7 RID: 2551 RVA: 0x0001B2E8 File Offset: 0x000194E8 [Conditional("TRACE")] [Conditional("DEBUG")] private void ShowWatcherInfo() { Console.WriteLine("Watcher implementation: {0}", (FileSystemWatcher.watcher == null) ? "" : FileSystemWatcher.watcher.GetType().ToString()); } // Token: 0x1700028E RID: 654 // (get) Token: 0x060009F8 RID: 2552 RVA: 0x0001B318 File Offset: 0x00019518 // (set) Token: 0x060009F9 RID: 2553 RVA: 0x0001B320 File Offset: 0x00019520 internal bool Waiting { get { return this.waiting; } set { this.waiting = value; } } // Token: 0x1700028F RID: 655 // (get) Token: 0x060009FA RID: 2554 RVA: 0x0001B32C File Offset: 0x0001952C internal string MangledFilter { get { if (this.filter != "*.*") { return this.filter; } if (this.mangledFilter != null) { return this.mangledFilter; } string text = "*.*"; if (FileSystemWatcher.watcher.GetType() != typeof(WindowsWatcher)) { text = "*"; } return text; } } // Token: 0x17000290 RID: 656 // (get) Token: 0x060009FB RID: 2555 RVA: 0x0001B390 File Offset: 0x00019590 internal SearchPattern2 Pattern { get { if (this.pattern == null) { this.pattern = new SearchPattern2(this.MangledFilter); } return this.pattern; } } // Token: 0x17000291 RID: 657 // (get) Token: 0x060009FC RID: 2556 RVA: 0x0001B3C0 File Offset: 0x000195C0 internal string FullPath { get { if (this.fullpath == null) { if (this.path == null || this.path == string.Empty) { this.fullpath = Environment.CurrentDirectory; } else { this.fullpath = global::System.IO.Path.GetFullPath(this.path); } } return this.fullpath; } } /// Gets or sets a value indicating whether the component is enabled. /// true if the component is enabled; otherwise, false. The default is false. If you are using the component on a designer in Visual Studio 2005, the default is true. /// The object has been disposed. /// The current operating system is not Microsoft Windows NT or later. /// The directory specified in could not be found. /// /// has not been set or is invalid. /// 2 // Token: 0x17000292 RID: 658 // (get) Token: 0x060009FD RID: 2557 RVA: 0x0001B420 File Offset: 0x00019620 // (set) Token: 0x060009FE RID: 2558 RVA: 0x0001B428 File Offset: 0x00019628 [global::System.ComponentModel.DefaultValue(false)] [IODescription("Flag to indicate if this instance is active")] public bool EnableRaisingEvents { get { return this.enableRaisingEvents; } set { if (value == this.enableRaisingEvents) { return; } this.enableRaisingEvents = value; if (value) { this.Start(); } else { this.Stop(); } } } /// Gets or sets the filter string used to determine what files are monitored in a directory. /// The filter string. The default is "*.*" (Watches all files.) /// 2 // Token: 0x17000293 RID: 659 // (get) Token: 0x060009FF RID: 2559 RVA: 0x0001B458 File Offset: 0x00019658 // (set) Token: 0x06000A00 RID: 2560 RVA: 0x0001B460 File Offset: 0x00019660 [IODescription("File name filter pattern")] [global::System.ComponentModel.DefaultValue("*.*")] [global::System.ComponentModel.RecommendedAsConfigurable(true)] [global::System.ComponentModel.TypeConverter("System.Diagnostics.Design.StringValueConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public string Filter { get { return this.filter; } set { if (value == null || value == string.Empty) { value = "*.*"; } if (this.filter != value) { this.filter = value; this.pattern = null; this.mangledFilter = null; } } } /// Gets or sets a value indicating whether subdirectories within the specified path should be monitored. /// true if you want to monitor subdirectories; otherwise, false. The default is false. /// 2 // Token: 0x17000294 RID: 660 // (get) Token: 0x06000A01 RID: 2561 RVA: 0x0001B4B0 File Offset: 0x000196B0 // (set) Token: 0x06000A02 RID: 2562 RVA: 0x0001B4B8 File Offset: 0x000196B8 [IODescription("Flag to indicate we want to watch subdirectories")] [global::System.ComponentModel.DefaultValue(false)] public bool IncludeSubdirectories { get { return this.includeSubdirectories; } set { if (this.includeSubdirectories == value) { return; } this.includeSubdirectories = value; if (value && this.enableRaisingEvents) { this.Stop(); this.Start(); } } } /// Gets or sets the size of the internal buffer. /// The internal buffer size. The default is 8192 (8 KB). /// 2 // Token: 0x17000295 RID: 661 // (get) Token: 0x06000A03 RID: 2563 RVA: 0x0001B4EC File Offset: 0x000196EC // (set) Token: 0x06000A04 RID: 2564 RVA: 0x0001B4F4 File Offset: 0x000196F4 [global::System.ComponentModel.DefaultValue(8192)] [global::System.ComponentModel.Browsable(false)] public int InternalBufferSize { get { return this.internalBufferSize; } set { if (this.internalBufferSize == value) { return; } if (value < 4196) { value = 4196; } this.internalBufferSize = value; if (this.enableRaisingEvents) { this.Stop(); this.Start(); } } } /// Gets or sets the type of changes to watch for. /// One of the values. The default is the bitwise OR combination of LastWrite, FileName, and DirectoryName. /// The value is not a valid bitwise OR combination of the values. /// The value that is being set is not valid. /// 2 // Token: 0x17000296 RID: 662 // (get) Token: 0x06000A05 RID: 2565 RVA: 0x0001B534 File Offset: 0x00019734 // (set) Token: 0x06000A06 RID: 2566 RVA: 0x0001B53C File Offset: 0x0001973C [global::System.ComponentModel.DefaultValue(NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastWrite)] [IODescription("Flag to indicate which change event we want to monitor")] public NotifyFilters NotifyFilter { get { return this.notifyFilter; } set { if (this.notifyFilter == value) { return; } this.notifyFilter = value; if (this.enableRaisingEvents) { this.Stop(); this.Start(); } } } /// Gets or sets the path of the directory to watch. /// The path to monitor. The default is an empty string (""). /// The specified path does not exist or could not be found.-or- The specified path contains wildcard characters.-or- The specified path contains invalid path characters. /// 2 // Token: 0x17000297 RID: 663 // (get) Token: 0x06000A07 RID: 2567 RVA: 0x0001B56C File Offset: 0x0001976C // (set) Token: 0x06000A08 RID: 2568 RVA: 0x0001B574 File Offset: 0x00019774 [global::System.ComponentModel.RecommendedAsConfigurable(true)] [global::System.ComponentModel.DefaultValue("")] [IODescription("The directory to monitor")] [global::System.ComponentModel.Editor("System.Diagnostics.Design.FSWPathEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] [global::System.ComponentModel.TypeConverter("System.Diagnostics.Design.StringValueConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")] public string Path { get { return this.path; } set { if (this.path == value) { return; } bool flag = false; Exception ex = null; try { flag = Directory.Exists(value); } catch (Exception ex2) { ex = ex2; } if (ex != null) { throw new ArgumentException("Invalid directory name", "value", ex); } if (!flag) { throw new ArgumentException("Directory does not exists", "value"); } this.path = value; this.fullpath = null; if (this.enableRaisingEvents) { this.Stop(); this.Start(); } } } /// Gets or sets an for the . /// An for the . /// 2 // Token: 0x17000298 RID: 664 // (get) Token: 0x06000A09 RID: 2569 RVA: 0x0001B61C File Offset: 0x0001981C // (set) Token: 0x06000A0A RID: 2570 RVA: 0x0001B624 File Offset: 0x00019824 [global::System.ComponentModel.Browsable(false)] public override global::System.ComponentModel.ISite Site { get { return base.Site; } set { base.Site = value; } } /// Gets or sets the object used to marshal the event handler calls issued as a result of a directory change. /// The that represents the object used to marshal the event handler calls issued as a result of a directory change. The default is null. /// 2 // Token: 0x17000299 RID: 665 // (get) Token: 0x06000A0B RID: 2571 RVA: 0x0001B630 File Offset: 0x00019830 // (set) Token: 0x06000A0C RID: 2572 RVA: 0x0001B638 File Offset: 0x00019838 [global::System.ComponentModel.Browsable(false)] [IODescription("The object used to marshal the event handler calls resulting from a directory change")] [global::System.ComponentModel.DefaultValue(null)] public global::System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get { return this.synchronizingObject; } set { this.synchronizingObject = value; } } /// Begins the initialization of a used on a form or used by another component. The initialization occurs at run time. /// 2 // Token: 0x06000A0D RID: 2573 RVA: 0x0001B644 File Offset: 0x00019844 public void BeginInit() { } /// Releases the unmanaged resources used by the and optionally releases the managed resources. /// true to release both managed and unmanaged resources; false to release only unmanaged resources. // Token: 0x06000A0E RID: 2574 RVA: 0x0001B648 File Offset: 0x00019848 protected override void Dispose(bool disposing) { if (!this.disposed) { this.disposed = true; this.Stop(); } base.Dispose(disposing); } // Token: 0x06000A0F RID: 2575 RVA: 0x0001B66C File Offset: 0x0001986C ~FileSystemWatcher() { this.disposed = true; this.Stop(); } /// Ends the initialization of a used on a form or used by another component. The initialization occurs at run time. /// 2 // Token: 0x06000A10 RID: 2576 RVA: 0x0001B6B0 File Offset: 0x000198B0 public void EndInit() { } // Token: 0x06000A11 RID: 2577 RVA: 0x0001B6B4 File Offset: 0x000198B4 private void RaiseEvent(Delegate ev, EventArgs arg, FileSystemWatcher.EventType evtype) { if (ev == null) { return; } if (this.synchronizingObject == null) { switch (evtype) { case FileSystemWatcher.EventType.FileSystemEvent: ((FileSystemEventHandler)ev).BeginInvoke(this, (FileSystemEventArgs)arg, null, null); break; case FileSystemWatcher.EventType.ErrorEvent: ((ErrorEventHandler)ev).BeginInvoke(this, (ErrorEventArgs)arg, null, null); break; case FileSystemWatcher.EventType.RenameEvent: ((RenamedEventHandler)ev).BeginInvoke(this, (RenamedEventArgs)arg, null, null); break; } return; } this.synchronizingObject.BeginInvoke(ev, new object[] { this, arg }); } /// Raises the event. /// A that contains the event data. // Token: 0x06000A12 RID: 2578 RVA: 0x0001B758 File Offset: 0x00019958 protected void OnChanged(FileSystemEventArgs e) { this.RaiseEvent(this.Changed, e, FileSystemWatcher.EventType.FileSystemEvent); } /// Raises the event. /// A that contains the event data. // Token: 0x06000A13 RID: 2579 RVA: 0x0001B768 File Offset: 0x00019968 protected void OnCreated(FileSystemEventArgs e) { this.RaiseEvent(this.Created, e, FileSystemWatcher.EventType.FileSystemEvent); } /// Raises the event. /// A that contains the event data. // Token: 0x06000A14 RID: 2580 RVA: 0x0001B778 File Offset: 0x00019978 protected void OnDeleted(FileSystemEventArgs e) { this.RaiseEvent(this.Deleted, e, FileSystemWatcher.EventType.FileSystemEvent); } /// Raises the event. /// An that contains the event data. // Token: 0x06000A15 RID: 2581 RVA: 0x0001B788 File Offset: 0x00019988 protected void OnError(ErrorEventArgs e) { this.RaiseEvent(this.Error, e, FileSystemWatcher.EventType.ErrorEvent); } /// Raises the event. /// A that contains the event data. // Token: 0x06000A16 RID: 2582 RVA: 0x0001B798 File Offset: 0x00019998 protected void OnRenamed(RenamedEventArgs e) { this.RaiseEvent(this.Renamed, e, FileSystemWatcher.EventType.RenameEvent); } /// A synchronous method that returns a structure that contains specific information on the change that occurred, given the type of change you want to monitor. /// A that contains specific information on the change that occurred. /// The to watch for. /// 2 // Token: 0x06000A17 RID: 2583 RVA: 0x0001B7A8 File Offset: 0x000199A8 public WaitForChangedResult WaitForChanged(WatcherChangeTypes changeType) { return this.WaitForChanged(changeType, -1); } /// A synchronous method that returns a structure that contains specific information on the change that occurred, given the type of change you want to monitor and the time (in milliseconds) to wait before timing out. /// A that contains specific information on the change that occurred. /// The to watch for. /// The time (in milliseconds) to wait before timing out. /// 2 // Token: 0x06000A18 RID: 2584 RVA: 0x0001B7B4 File Offset: 0x000199B4 public WaitForChangedResult WaitForChanged(WatcherChangeTypes changeType, int timeout) { WaitForChangedResult waitForChangedResult = default(WaitForChangedResult); bool flag = this.EnableRaisingEvents; if (!flag) { this.EnableRaisingEvents = true; } bool flag2; lock (this) { this.waiting = true; flag2 = Monitor.Wait(this, timeout); if (flag2) { waitForChangedResult = this.lastData; } } this.EnableRaisingEvents = flag; if (!flag2) { waitForChangedResult.TimedOut = true; } return waitForChangedResult; } // Token: 0x06000A19 RID: 2585 RVA: 0x0001B840 File Offset: 0x00019A40 internal void DispatchEvents(FileAction act, string filename, ref RenamedEventArgs renamed) { if (this.waiting) { this.lastData = default(WaitForChangedResult); } switch (act) { case FileAction.Added: this.lastData.Name = filename; this.lastData.ChangeType = WatcherChangeTypes.Created; this.OnCreated(new FileSystemEventArgs(WatcherChangeTypes.Created, this.path, filename)); break; case FileAction.Removed: this.lastData.Name = filename; this.lastData.ChangeType = WatcherChangeTypes.Deleted; this.OnDeleted(new FileSystemEventArgs(WatcherChangeTypes.Deleted, this.path, filename)); break; case FileAction.Modified: this.lastData.Name = filename; this.lastData.ChangeType = WatcherChangeTypes.Changed; this.OnChanged(new FileSystemEventArgs(WatcherChangeTypes.Changed, this.path, filename)); break; case FileAction.RenamedOldName: if (renamed != null) { this.OnRenamed(renamed); } this.lastData.OldName = filename; this.lastData.ChangeType = WatcherChangeTypes.Renamed; renamed = new RenamedEventArgs(WatcherChangeTypes.Renamed, this.path, filename, string.Empty); break; case FileAction.RenamedNewName: this.lastData.Name = filename; this.lastData.ChangeType = WatcherChangeTypes.Renamed; if (renamed == null) { renamed = new RenamedEventArgs(WatcherChangeTypes.Renamed, this.path, string.Empty, filename); } this.OnRenamed(renamed); renamed = null; break; } } // Token: 0x06000A1A RID: 2586 RVA: 0x0001B9A4 File Offset: 0x00019BA4 private void Start() { FileSystemWatcher.watcher.StartDispatching(this); } // Token: 0x06000A1B RID: 2587 RVA: 0x0001B9B4 File Offset: 0x00019BB4 private void Stop() { FileSystemWatcher.watcher.StopDispatching(this); } // Token: 0x06000A1C RID: 2588 [MethodImpl(MethodImplOptions.InternalCall)] private static extern int InternalSupportsFSW(); // Token: 0x04000362 RID: 866 private bool enableRaisingEvents; // Token: 0x04000363 RID: 867 private string filter; // Token: 0x04000364 RID: 868 private bool includeSubdirectories; // Token: 0x04000365 RID: 869 private int internalBufferSize; // Token: 0x04000366 RID: 870 private NotifyFilters notifyFilter; // Token: 0x04000367 RID: 871 private string path; // Token: 0x04000368 RID: 872 private string fullpath; // Token: 0x04000369 RID: 873 private global::System.ComponentModel.ISynchronizeInvoke synchronizingObject; // Token: 0x0400036A RID: 874 private WaitForChangedResult lastData; // Token: 0x0400036B RID: 875 private bool waiting; // Token: 0x0400036C RID: 876 private SearchPattern2 pattern; // Token: 0x0400036D RID: 877 private bool disposed; // Token: 0x0400036E RID: 878 private string mangledFilter; // Token: 0x0400036F RID: 879 private static IFileWatcher watcher; // Token: 0x04000370 RID: 880 private static object lockobj = new object(); // Token: 0x02000117 RID: 279 private enum EventType { // Token: 0x04000377 RID: 887 FileSystemEvent, // Token: 0x04000378 RID: 888 ErrorEvent, // Token: 0x04000379 RID: 889 RenameEvent } } }