none
FileSystemWatcher 偵測某一段檔名重複問題 RRS feed

  • 問題

  • 各位前輩好,小弟做車牌辨識撈資料辨別問題

    ********dirInfo.Name就是我偵測到所傳回的異動資料名字, 然後執行sqlconn() 就是我寫入資料庫的方法,這樣就登入為一筆資料了,而因為同一台車牌會拍好幾張,照我上面的做法,就是會登入好幾筆資料進去,我想請問的是,例如偵測第一張20170524_1_abc-123 和 第二張20170524_2_abc-123,因為車牌都是abc-123,所以第二張就不異動或是不登入到資料庫,就是說第一張偵測到時,限制30秒內再偵測到相同abc-123時,就不登入到我的資料庫去,我自己是想到 dirInfo.Name(第一張) 丟到暫存裡面(宣告一個東西裝它),然後下一張 跟他比對,相同就不invoke,但實際我不知道怎麼做,請各位前輩指點下,謝謝

    以下是我偵測資料夾異動CODE

    //宣告一下            FileSystemWatcher _watch = new FileSystemWatcher();

            /// 當所監控的資料夾有建檔時觸發       
            private void MyFileSystemWatcher()
            {            
                //設定所要監控的資料夾
                _watch.Path = ree;
                //設定所要監控的變更類型
                _watch.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                //設定所要監控的檔案
                //_watch.Filter = ("*.jpg","*.jpeg", "*.png", "*.gif", "*.bmp");
                //偵測有異動就ture
                _watch.EnableRaisingEvents = true;
                //設定是否監控子資料夾
                _watch.IncludeSubdirectories = true;    
                //設定是否啟動元件,此部分必須要設定為 true,不然事件是不會被觸發的
                _watch.EnableRaisingEvents = true;
                //設定觸發事件
                _watch.Created += new FileSystemEventHandler(_watch_Created);
                
            }private void _watch_Created(object sender, FileSystemEventArgs e)
            {          
               //偵測異動資料路徑並轉字串
                dirInfo = new DirectoryInfo(e.FullPath.ToString());
                pictureBox1.Image = Image.FromFile(dirInfo.FullName);        

                // 委派
                this.Invoke(new SetLabel(SetLabelMethod), dirInfo.Name );          

            }

    *********以上偵測到異動時進行委派傳給以下

     //宣告委派方法
            public delegate void SetLabel(string msg);
            //當_watch_Created 偵測到資料夾異動之後返回invoke開始執行SetLabelMethod方法
            public void SetLabelMethod(string msg)
            {
                //msg傳回日期和車牌資料,再切一切就好
                label3.Text = msg.Substring(5);

                //將msg資料跟白名單 黑名單進行X碼比對,白對中(直接跳過黑和警告),白沒中就對黑,
                //黑對中(跳過警告),都沒中就丟到警告名單
                // sqlconn 連結資料庫 進行比對
                sqlconn();
            }



    • 已編輯 pigpp 2017年5月24日 上午 10:08
    2017年5月24日 上午 10:06

解答

  • 就搞個 List<T> 來存, 記得要存時間戳記,這時間戳記有兩個用途,(1) 比對是否在 30 秒內 (2) 如果時間戳記到目前時間已經超過 30 秒,就標記為準備移除,然後找個好時間移除掉就行了。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 pigpp 2017年5月31日 上午 01:31
    2017年5月24日 上午 11:31
    版主

所有回覆

  •  

    更改如下 ,但 我要第一張持續30秒 有重覆都不寫入

    private void _watch_Created(object sender, FileSystemEventArgs e)
            {          
               //偵測異動資料路徑並轉字串
                dirInfo = new DirectoryInfo(e.FullPath.ToString());
                pictureBox1.Image = Image.FromFile(dirInfo.FullName);

                if(carNum != dirInfo.FullName)//車牌都不同的話
                {
                    carNum = dirInfo.FullName;//丟到暫存
                    this.Invoke(new SetLabel(SetLabelMethod), dirInfo.Name);//回傳出去
                }


            }

                      
    2017年5月24日 上午 10:28
  • 就搞個 List<T> 來存, 記得要存時間戳記,這時間戳記有兩個用途,(1) 比對是否在 30 秒內 (2) 如果時間戳記到目前時間已經超過 30 秒,就標記為準備移除,然後找個好時間移除掉就行了。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 pigpp 2017年5月31日 上午 01:31
    2017年5月24日 上午 11:31
    版主