{"id":3244,"date":"2020-04-20T10:12:11","date_gmt":"2020-04-20T01:12:11","guid":{"rendered":"https:\/\/okamurax.com\/?p=3244"},"modified":"2020-04-21T20:31:19","modified_gmt":"2020-04-21T11:31:19","slug":"c-%e3%83%95%e3%82%a9%e3%83%ab%e3%83%80%e7%9b%a3%e8%a6%96%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e8%bf%bd%e5%8a%a0%e3%83%bb%e6%9b%b4%e6%96%b0%e3%83%81%e3%82%a7%e3%83%83%e3%82%af","status":"publish","type":"post","link":"https:\/\/appbay.org\/?p=3244","title":{"rendered":"C# \u30d5\u30a9\u30eb\u30c0\u76e3\u8996(\u30d5\u30a1\u30a4\u30eb\u8ffd\u52a0\u30fb\u66f4\u65b0\u30c1\u30a7\u30c3\u30af)"},"content":{"rendered":"<p>\u7c21\u6613\u7684\u306a\u30d5\u30a9\u30eb\u30c0\u306e\u76e3\u8996\u30bd\u30d5\u30c8\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002\u524a\u9664\u306f\u691c\u77e5\u305b\u305a\u3001\u66f4\u65b0(\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba)\u3068\u8ffd\u52a0\u306e\u307f\u3002<\/p>\n<p>\u62e0\u70b9\u9593\u3067\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u63d0\u51fa\u3092\u30b7\u30b9\u30c6\u30e0\u5316\u3057\u3088\u3046\u3068\u306a\u308a\u3001\u5148\u305a\u5168\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u5316\u304b\u306a\u3068\u3082\u8003\u3048\u305f\u306e\u3060\u304c\u3001\u73fe\u72b6\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u96db\u5f62\u306e\u6574\u7406\u304c\u3067\u304d\u3066\u3044\u306a\u3044\u306e\u3067\u3001\u9805\u76ee\u5168\u3066\u3092\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u843d\u3068\u3057\u8fbc\u3080\u306b\u306f\u6642\u9593\u304c\u304b\u304b\u3063\u3066\u3057\u307e\u3046\u3002<\/p>\n<p>\u305d\u308c\u306a\u3089\u3001\u30d5\u30a1\u30a4\u30eb\u305d\u306e\u3082\u306e\u3092\u30d5\u30a9\u30eb\u30c0\u306b\u5165\u308c\u3066\u304a\u3051\u3070\u3044\u3044\u3060\u308d\u3046\u3068\u8003\u3048\u76e3\u8996\u30bd\u30d5\u30c8\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002\u3082\u3063\u3068\u9ad8\u6a5f\u80fd\u306a\u30bd\u30d5\u30c8\u304c\u30d5\u30ea\u30fc\u3067\u3082\u3042\u308b\u3051\u3069\u3001\u81ea\u4f5c\u3057\u3066\u304a\u304f\u3068\u5f8c\u3005\u30d5\u30a1\u30a4\u30eb\u306e\u540d\u79f0\u306a\u3069\u3067\u30d5\u30a3\u30eb\u30bf\u3092\u304b\u3051\u305f\u308a\u81ea\u7531\u306b\u3067\u304d\u308b\u3002<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Collections.Generic;\r\nusing System.ComponentModel;\r\nusing System.Data;\r\nusing System.Drawing;\r\nusing System.Linq;\r\nusing System.Text;\r\nusing System.Threading.Tasks;\r\nusing System.Windows.Forms;\r\n\r\nusing System.Xml.Serialization;\r\nusing System.IO;\r\n\r\nnamespace FileUpdateCheck\r\n{\r\n    public partial class Form1 : Form\r\n    {\r\n        string _XmlPath = Application.StartupPath + @\"\\dat_path.xml\";\r\n        string _XmlFileList = Application.StartupPath + @\"\\dat_file_list.xml\";\r\n\r\n        Timer _Timer = new Timer();\r\n        List&lt;MyFileInfo&gt; _BeforeFileList = new List&lt;MyFileInfo&gt;();\r\n\r\n        public Form1()\r\n        {\r\n            InitializeComponent();\r\n\r\n            EventAttach();\r\n            SetNotifyIcon();\r\n\r\n            _Timer.Interval = 1000 * 60; \/\/ 1\u5206\r\n            _Timer.Tick += (s, e) =&gt; TimerWork();\r\n\r\n            ButtonStateChange(ButtonState.waiting);\r\n\r\n            if (File.Exists(_XmlPath))\r\n            {\r\n                string path = \"\";\r\n                using (StreamReader sr = new StreamReader(_XmlPath, Encoding.UTF8))\r\n                {\r\n                    path = (string)new XmlSerializer(typeof(string)).Deserialize(sr);\r\n                }\r\n\r\n                if (Directory.Exists(path))\r\n                {\r\n                    TargetFolderPath.Text = path;\r\n                    \/\/ Path\u306eXml\u304c\u5b58\u5728\u3057\u3001Path\u304c\u6709\u52b9\u306a\u3089Textbox\u3078\r\n\r\n                    if (File.Exists(_XmlFileList))\r\n                    {\r\n                        using (StreamReader sr = new StreamReader(_XmlFileList, Encoding.UTF8))\r\n                        {\r\n                            _BeforeFileList = new List&lt;MyFileInfo&gt;((List&lt;MyFileInfo&gt;)new XmlSerializer(typeof(List&lt;MyFileInfo&gt;)).Deserialize(sr));\r\n                        }\r\n\r\n                        \/\/ \u81ea\u52d5\u8d77\u52d5\u3059\u308b\u306e\u306fXML\u304c2\u3064\u6709\u3063\u305f\u5834\u5408\r\n                        \/\/ FileList\u306eXml\u306f\u30b9\u30c8\u30c3\u30d7\u6642\u524a\u9664\u3059\u308b\u306e\u3067\u30012\u3064\u3042\u308b\u5834\u5408\u3001\u30b9\u30c8\u30c3\u30d7\u3057\u3066\u3044\u306a\u3044\u3068\u3044\u3046\u3053\u3068\r\n                        _Timer.Start();\r\n\r\n                        ButtonStateChange(ButtonState.working);\r\n                        WindowState = FormWindowState.Minimized;\r\n                        ShowInTaskbar = false;\r\n\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        private void EventAttach()\r\n        {\r\n            this.ClientSizeChanged += (s, e) =&gt;\r\n            {\r\n                if (WindowState == FormWindowState.Minimized)\r\n                {\r\n                    ShowInTaskbar = false;\r\n                }\r\n            };\r\n\r\n            this.FormClosing += (s, e) =&gt;\r\n            {\r\n                e.Cancel = true;\r\n                WindowState = FormWindowState.Minimized;\r\n            };\r\n\r\n            StartButton.Click += (s, e) =&gt; StartWatch();\r\n            StopButton.Click += (s, e) =&gt; StopWatch();\r\n            ExitButton.Click += (s, e) =&gt;\r\n            {\r\n                DialogResult yesNo = MessageBox.Show(\"\u7d42\u4e86\u3057\u307e\u3059\u304b\uff1f\", \"\", MessageBoxButtons.YesNo);\r\n                if (yesNo == DialogResult.No) return;\r\n                Application.Exit();\r\n            };\r\n        }\r\n\r\n        private void SetNotifyIcon()\r\n        {\r\n            Bitmap darkGreenBitmap = new Bitmap(32, 32);\r\n            Graphics darkGreenGraphics = Graphics.FromImage(darkGreenBitmap);\r\n            darkGreenGraphics.FillRectangle(Brushes.DarkGreen, darkGreenGraphics.VisibleClipBounds);\r\n\r\n            Bitmap greenBitmap = new Bitmap(32, 32);\r\n            Graphics greenGraphics = Graphics.FromImage(greenBitmap);\r\n            greenGraphics.FillRectangle(Brushes.Green, greenGraphics.VisibleClipBounds);\r\n\r\n            Icon[] icons = new Icon[] {\r\n                Icon.FromHandle(darkGreenBitmap.GetHicon()),\r\n                Icon.FromHandle(greenBitmap.GetHicon())\r\n            };\r\n\r\n            NotifyIcon notifyIcon = new NotifyIcon();\r\n            notifyIcon.Icon = Icon.FromHandle(darkGreenBitmap.GetHicon());\r\n            notifyIcon.Visible = true;\r\n            notifyIcon.Click += new EventHandler((object sender, EventArgs e) =&gt; {\r\n                WindowState = FormWindowState.Normal;\r\n                ShowInTaskbar = true;\r\n            });\r\n\r\n            int i = 0;\r\n            var t = new Timer();\r\n            t.Interval = 1000;\r\n            t.Tick += (s, e) =&gt;\r\n            {\r\n                notifyIcon.Icon = icons[i++];\r\n                if (i == 2) i = 0;\r\n            };\r\n            t.Start();\r\n        }\r\n\r\n        private void TimerWork()\r\n        {\r\n            List&lt;string&gt; message = new List&lt;string&gt;();\r\n\r\n            if (_BeforeFileList.Count &gt; 0)\r\n            {\r\n                foreach(var currentFileInfo in GetCurrentMyFileInfoList())\r\n                {\r\n                    bool isNew = true;\r\n                    bool isUpdate = false;\r\n\r\n                    foreach (var beforeFileInfo in _BeforeFileList)\r\n                    {\r\n                        if (currentFileInfo.Name == beforeFileInfo.Name)\r\n                        {\r\n                            isNew = false;\r\n                            if (currentFileInfo.Length != beforeFileInfo.Length) isUpdate = true;\r\n                        }\r\n                    }\r\n\r\n                    if (isNew) message.Add(\"\u65b0\u898f\uff1a\u3000\" + currentFileInfo.Name);\r\n                    if (isUpdate) message.Add(\"\u66f4\u65b0\uff1a\u3000\" + currentFileInfo.Name);\r\n                }\r\n            }\r\n\r\n            _BeforeFileList.Clear();\r\n            _BeforeFileList = new List&lt;MyFileInfo&gt;(GetCurrentMyFileInfoList());\r\n\r\n            using (StreamWriter sw = new StreamWriter(_XmlFileList, false, Encoding.UTF8))\r\n            {\r\n                new XmlSerializer(typeof(List&lt;MyFileInfo&gt;)).Serialize(sw, _BeforeFileList);\r\n            }\r\n\r\n            if (message.Count &gt; 0) MessageBox.Show(string.Join(Environment.NewLine, message));\r\n        }\r\n\r\n        private List&lt;MyFileInfo&gt; GetCurrentMyFileInfoList()\r\n        {\r\n            List&lt;MyFileInfo&gt; fileInfoList = new List&lt;MyFileInfo&gt;();\r\n            foreach (string file in Directory.GetFiles(TargetFolderPath.Text, \"*\", SearchOption.TopDirectoryOnly))\r\n            {\r\n                var fi = new FileInfo(file);\r\n                fi.Refresh();\r\n                fileInfoList.Add(new MyFileInfo { \r\n                    Name = fi.Name,\r\n                    Length = fi.Length\r\n                });\r\n            }\r\n            return fileInfoList;\r\n        }\r\n\r\n        private void StartWatch()\r\n        {\r\n            if(!Directory.Exists(TargetFolderPath.Text))\r\n            {\r\n                MessageBox.Show(\"\u30d5\u30a9\u30eb\u30c0\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\");\r\n                return;\r\n            }\r\n\r\n            using (StreamWriter sw = new StreamWriter(_XmlPath, false, Encoding.UTF8))\r\n            {\r\n                new XmlSerializer(typeof(string)).Serialize(sw, TargetFolderPath.Text);\r\n            }\r\n\r\n            TimerWork(); \r\n            \/\/ Timer\u306eTick\u304c\u5b9f\u884c\u3055\u308c\u308b\u524d\u306b\u7d42\u4e86\u3057\u305f\u5834\u5408\u3001_XmlFileList\u304c\u751f\u6210\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\r\n            \/\/ \u3053\u308c\u30672\u3064\u306eXml\u304c\u5b58\u5728\u3059\u308b\u72b6\u614b\u306b\u306a\u308b\r\n\r\n            _Timer.Start();\r\n\r\n            ButtonStateChange(ButtonState.working);\r\n        }\r\n\r\n        private void StopWatch()\r\n        {\r\n            _BeforeFileList.Clear();\r\n            File.Delete(_XmlFileList);\r\n            \/\/ \u7d42\u4e86\u6642\u3001Xml\u306f1\u3064(Path\u306e\u307f)\u3068\u306a\u308b\r\n\r\n            _Timer.Stop();\r\n\r\n            ButtonStateChange(ButtonState.waiting);\r\n        }\r\n\r\n        enum ButtonState { working, waiting }\r\n\r\n        private void ButtonStateChange(ButtonState buttonState)\r\n        {\r\n            switch (buttonState)\r\n            {\r\n                case ButtonState.waiting:\r\n                    StartButton.Enabled = true;\r\n                    StopButton.Enabled = false;\r\n                    TargetFolderPath.Enabled = true;\r\n                    this.Text = \"\u505c\u6b62\u4e2d\";\r\n                    break;\r\n\r\n                case ButtonState.working:\r\n                    StartButton.Enabled = false;\r\n                    StopButton.Enabled = true;\r\n                    TargetFolderPath.Enabled = false;\r\n                    this.Text = \"\u76e3\u8996\u4e2d\";\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    public class MyFileInfo\r\n    {\r\n        public string Name;\r\n        public long Length;\r\n    }\r\n\r\n}\r\n<\/pre>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/egaC-w9iqnQ\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7c21\u6613\u7684\u306a\u30d5\u30a9\u30eb\u30c0\u306e\u76e3\u8996\u30bd\u30d5\u30c8\u3092\u4f5c\u3063\u3066\u307f\u305f\u3002\u524a\u9664\u306f\u691c\u77e5\u305b\u305a\u3001\u66f4\u65b0(\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba)\u3068\u8ffd\u52a0\u306e\u307f\u3002 \u62e0\u70b9\u9593\u3067\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u63d0\u51fa\u3092\u30b7\u30b9\u30c6\u30e0\u5316\u3057\u3088\u3046\u3068\u306a\u308a\u3001\u5148\u305a\u5168\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u5316\u304b\u306a\u3068\u3082\u8003\u3048\u305f\u306e\u3060\u304c\u3001\u73fe\u72b6\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u96db\u5f62\u306e\u6574\u7406\u304c\u3067\u304d\u3066 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/appbay.org\/?p=3244\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;C# \u30d5\u30a9\u30eb\u30c0\u76e3\u8996(\u30d5\u30a1\u30a4\u30eb\u8ffd\u52a0\u30fb\u66f4\u65b0\u30c1\u30a7\u30c3\u30af)&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[9],"class_list":["post-3244","post","type-post","status-publish","format-standard","hentry","category-1","tag-c-net"],"_links":{"self":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/3244","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3244"}],"version-history":[{"count":5,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/3244\/revisions"}],"predecessor-version":[{"id":3274,"href":"https:\/\/appbay.org\/index.php?rest_route=\/wp\/v2\/posts\/3244\/revisions\/3274"}],"wp:attachment":[{"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/appbay.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}