首页 新闻 会员 周边 捐助

用FileSystemWatcher类自动监视文件夹中文件的异常问题

0
悬赏园豆:50 [已解决问题] 解决于 2014-10-15 13:43

asp.net程序需要读取某一个文件夹中的所有txt文件,读取后把数据插入数据库,同时移出该txt文件,文件夹中的txt文件是随时增加的,用FileSystemWatcher类对该文件夹进行监视,如果文件增加则调用执行插入数据库和移出该文件的操作!但是,程序过程中遇到异常未抛出并直接退出系统,对同一批文件断点调试时发现产生异常的文件不确定,望请各位大侠大神指教,本菇凉大恩不言谢!

c#程序代码如下:

private void Form_Main_Load(object sender, EventArgs e)
        {

             FileSystemWatcher fsw = new FileSystemWatcher();
             fsw.Path = ReadFilePath; 
         fsw.IncludeSubdirectories = false;     
         fsw.Filter = "*.txt";    
         fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size;   
         fsw.Created += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle);    
         fsw.EnableRaisingEvents = true;    
        }

private void fileSystemWatcher_EventHandle(object sender, FileSystemEventArgs e)  
        {

            if (e.ChangeType == WatcherChangeTypes.Created)
            {
                SaveFileToDataBase();
            }
        }
 
private void SaveFileToDataBase()
        {
            DirectoryInfo TheFolder = new DirectoryInfo(ReadFilePath);
            string pgd_vou_no = "", do_date = "", do_time = "", opr_usr_id = "", MTID = "", SN = "", PBcount = "", OK_flag = "";
            string fileName = "", bakfile = "";
            foreach (FileInfo NextFile in TheFolder.GetFiles())
            {
                fileName = NextFile.Name.ToString().Trim();
                fileName = fileName.Substring(fileName.Length - 16, 12);
                StreamReader sr = new StreamReader(NextFile.FullName, Encoding.Default);
                string OneLineTxt;
                int i = 0;
                while ((OneLineTxt = sr.ReadLine()) != null)
                {
                    i++;
                    string[] SplitTxt = OneLineTxt.Split(new char[] { ',' });
                    pgd_vou_no = SplitTxt[0].Trim();
                    do_date = SplitTxt[1].Trim();
                    do_time = SplitTxt[2].Trim();
                    //do_time = SplitTxt[1].Trim() + " " + SplitTxt[2].Trim();
                    opr_usr_id = SplitTxt[3].Trim();
                    MTID = SplitTxt[4].Trim();
                    SN = SplitTxt[5].Trim();
                    PBcount = SplitTxt[6].Trim();
                    OK_flag = SplitTxt[7].Trim();

                    string up_date = " m_item_stock_no='" + fileName.Trim() + "',ok_flag='" + OK_flag + "',do_time='" + do_time + "',usr_id='" + opr_usr_id.Trim() + "',PBcount='" + PBcount.Trim() + "',MTID='" + MTID + "'";
                    try
                    {
                        string up_flag = srv2.One_line_update("gl_MES_SMT_print", up_date, new string[] { "com_id", "vou_no", "item_stock_no" }, new string[] { cmps, pgd_vou_no, SN }, "update", "3");
                    }
                    catch (Exception ee)
                    {
                        MessageBox.Show(ee.ToString().Trim());
                    }
                }
                sr.Dispose();
                bakfile = BakFilePath + "\\" + NextFile.Name;
                if (File.Exists(bakfile))
                {
                    File.Delete(bakfile);
                }
                NextFile.MoveTo(bakfile);
            }
        }

 

调试文件如图:

调试文件内容:因为程序处于测试阶段,各txt文件的内容全部一样。根据断点调试,有时0007文件跳出,有时0009文件跳出。

濯舞拾弋的主页 濯舞拾弋 | 初学一级 | 园豆:90
提问于:2014-10-15 11:00
< >
分享
最佳答案
0

采用你所说的方法,你要注意一点,文件被占用的情况。加入文件锁定判断,或者通过延迟处理方式,减少想处理的文件还处于被占用状态的概率。

代码就不写了,Launcher说的基本就是对的。

收获园豆:25
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-10-15 11:43

大叔  问下 FileSystemWatcher怎么访问网路路径啊

濯舞拾弋 | 园豆:90 (初学一级) | 2014-11-03 10:43
其他回答(1)
0

你得把异常信息记录下。

收获园豆:25
Launcher | 园豆:45050 (高人七级) | 2014-10-15 11:03

他没给跳出异常  直接关闭了系统

支持(0) 反对(0) 濯舞拾弋 | 园豆:90 (初学一级) | 2014-10-15 11:05

@濯舞拾弋: 异常是肯定有的,找出来的方法很多,我懒得写。就你这段程序而言, 方法 fileSystemWatcher_EventHandle(object sender, FileSystemEventArgs e) 中的参数 e 可以得到新创建的文件的名称,你应该只对该文件操作,而非每次都遍历整个目录,你需要注意对同一个文件的并发访问问题。Created 事件触发应该是在文件创建后,此时文件被另一个进程打开,可能数据还没写完,根据其它程序打开此文件的方式,你可能无法读取该文件,或者无法修改等,你都得考虑清楚了。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-10-15 11:12

@Launcher: 大神啊  我弄出异常了   如何解决啊

支持(0) 反对(0) 濯舞拾弋 | 园豆:90 (初学一级) | 2014-10-15 11:16

@濯舞拾弋: 请看我前面对 Created 事件的分析。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-10-15 11:19

@濯舞拾弋: 会写代码了吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-10-15 11:39

@濯舞拾弋: 不要让他出异常,你这个异常就是说明文件被人占用,这时候你是没有办法删除这个文件的,让代码等几分钟,再重试。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-10-15 11:45

@Launcher: 感谢大神    在大神的英明指导下我已经搞定了次问题!这大神富贵长寿

支持(0) 反对(0) 濯舞拾弋 | 园豆:90 (初学一级) | 2014-10-15 13:28

@濯舞拾弋: 大神,你好,我想请问下你这个异常解决的代码可以贴出来吗?我也遇到了类似的问题。还没有解决

支持(0) 反对(0) shihuipu | 园豆:200 (初学一级) | 2016-03-28 17:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册