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文件跳出。
采用你所说的方法,你要注意一点,文件被占用的情况。加入文件锁定判断,或者通过延迟处理方式,减少想处理的文件还处于被占用状态的概率。
代码就不写了,Launcher说的基本就是对的。
大叔 问下 FileSystemWatcher怎么访问网路路径啊
你得把异常信息记录下。
他没给跳出异常 直接关闭了系统
@濯舞拾弋: 异常是肯定有的,找出来的方法很多,我懒得写。就你这段程序而言, 方法 fileSystemWatcher_EventHandle(object sender, FileSystemEventArgs e) 中的参数 e 可以得到新创建的文件的名称,你应该只对该文件操作,而非每次都遍历整个目录,你需要注意对同一个文件的并发访问问题。Created 事件触发应该是在文件创建后,此时文件被另一个进程打开,可能数据还没写完,根据其它程序打开此文件的方式,你可能无法读取该文件,或者无法修改等,你都得考虑清楚了。
@Launcher: 大神啊 我弄出异常了 如何解决啊
@濯舞拾弋: 请看我前面对 Created 事件的分析。
@濯舞拾弋: 会写代码了吗?
@濯舞拾弋: 不要让他出异常,你这个异常就是说明文件被人占用,这时候你是没有办法删除这个文件的,让代码等几分钟,再重试。
@Launcher: 感谢大神 在大神的英明指导下我已经搞定了次问题!这大神富贵长寿
@濯舞拾弋: 大神,你好,我想请问下你这个异常解决的代码可以贴出来吗?我也遇到了类似的问题。还没有解决