{"id":2780,"date":"2019-10-29T13:56:12","date_gmt":"2019-10-29T12:56:12","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=2780"},"modified":"2024-08-22T08:44:03","modified_gmt":"2024-08-22T07:44:03","slug":"c-watch-for-file-changes","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-watch-for-file-changes\/","title":{"rendered":"C# watch for file changes"},"content":{"rendered":"\n<p><a href=\"https:\/\/stackoverflow.com\/a\/721743\">https:\/\/stackoverflow.com\/a\/721743<\/a><\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">public class ValidTime\n{\n\tprivate DateTime _validTo;\n\treadonly TimeSpan _validTimeSpan;\n\n\tprivate ValidTime(TimeSpan validTimeSpan)\n\t{\n\t\t_validTimeSpan = validTimeSpan;\n\t\t_validTo = DateTime.Now.Add(_validTimeSpan);\n\t}\n\n\tpublic bool IsValid() => DateTime.Now >= _validTo;\n\tpublic void Reset() => _validTo = DateTime.Now.Add(_validTimeSpan);\n\tpublic static ValidTime From(TimeSpan ts) => new(ts);\n}\n\npublic class DirectoryWatcher\n{\n\treadonly ValidTime _watcherValidTime;\n\treadonly string _path;\n\treadonly Action _action;\n\tIDisposable _watcher;\n\n\tpublic DirectoryWatcher(string path, TimeSpan validTime, Action action)\n\t{\n\t\t_watcherValidTime = ValidTime.From(validTime);\n\t\t_path = path;\n\t\t_action = action;\n\t}\n\n\tpublic void UpdateWatcher(bool checkNow = false)\n\t{\n\t\tif (_watcher != null &amp;&amp; _watcherValidTime.IsValid()) return;\n\t\t_watcherValidTime.Reset();\n\n\t\t_watcher?.Dispose();\n\t\t_watcher = CreateFileWatcher(_path, (object sender, EventArgs e) => _action());\n\n\t\tif (checkNow)\n\t\t\t_action();\n\t}\n\n\tpublic static IDisposable CreateFileWatcher(string path, EventHandler onSomethingChanged)\n\t{\n\t\tvar watcher = new FileSystemWatcher\n\t\t{\n\t\t\tPath = path,\n\t\t\tIncludeSubdirectories = true,\n\t\t};\n\t\t\/\/ Add event handlers.\n\t\twatcher.Changed += (a, b) => onSomethingChanged(a, b);\n\t\twatcher.Created += (a, b) => onSomethingChanged(a, b);\n\t\twatcher.Deleted += (a, b) => onSomethingChanged(a, b);\n\t\twatcher.Renamed += (a, b) => onSomethingChanged(a, b);\n\t\t\/\/ Begin watching.\n\t\twatcher.EnableRaisingEvents = true;\n\t\treturn watcher;\n\t}\n}<\/pre><\/div>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        public IDisposable WatchForFolderChanges(string path, Action&lt;object, object> onSomethingChanged)\n        {\n            var watcher = new FileSystemWatcher\n            {\n                Path = path,\n                IncludeSubdirectories = true,\n            };\n\n            \/\/ Add event handlers.\n            watcher.Changed += (a, b) => onSomethingChanged(a, b);\n            watcher.Created += (a, b) => onSomethingChanged(a, b);\n            watcher.Deleted += (a, b) => onSomethingChanged(a, b);\n            watcher.Renamed += (a, b) => onSomethingChanged(a, b);\n\n            \/\/ Begin watching.\n            watcher.EnableRaisingEvents = true;\n            return watcher;\n        }\n\n\npublic void CreateFileWatcher(string path)\n{\n    \/\/ Create a new FileSystemWatcher and set its properties.\n    FileSystemWatcher watcher = new FileSystemWatcher();\n    watcher.Path = path;\n    \/* Watch for changes in LastAccess and LastWrite times, and \n       the renaming of files or directories. *\/\n    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite \n       | NotifyFilters.FileName | NotifyFilters.DirectoryName;\n    \/\/ Only watch text files.\n    watcher.Filter = \"*.txt\";\n\n    \/\/ Add event handlers.\n    watcher.Changed += new FileSystemEventHandler(OnChanged);\n    watcher.Created += new FileSystemEventHandler(OnChanged);\n    watcher.Deleted += new FileSystemEventHandler(OnChanged);\n    watcher.Renamed += new RenamedEventHandler(OnRenamed);\n\n    \/\/ Begin watching.\n    watcher.EnableRaisingEvents = true;\n}\n\n\/\/ Define the event handlers.\nprivate static void OnChanged(object source, FileSystemEventArgs e)\n{\n    \/\/ Specify what is done when a file is changed, created, or deleted.\n   Console.WriteLine(\"File: \" +  e.FullPath + \" \" + e.ChangeType);\n}\n\nprivate static void OnRenamed(object source, RenamedEventArgs e)\n{\n    \/\/ Specify what is done when a file is renamed.\n    Console.WriteLine(\"File: {0} renamed to {1}\", e.OldFullPath, e.FullPath);\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/stackoverflow.com\/a\/721743<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6,4,1],"tags":[],"class_list":["post-2780","post","type-post","status-publish","format-standard","hentry","category-dotnet","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=2780"}],"version-history":[{"count":3,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2780\/revisions"}],"predecessor-version":[{"id":8880,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2780\/revisions\/8880"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=2780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=2780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=2780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}