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

weixin_41329719 2018-03-14 10:44:46
c#程序需要实时读取某一个文件夹中的新增txt文件,读取后把数据插入Oracle数据库,文件夹中的txt文件是随时增加的,用FileSystemWatcher类对该文件夹进行监视,如果文件增加则调用执行插入数据库操作!但是,当一次新增txt文件时程序没有出现问题第二次出现进程被占的问题,代码如下,麻烦各位大神帮忙瞅瞅有问题在哪,给出解决方法。


class Program
{
static void Main(string[] args)
{
int i = 0;
FileSystemWatcher fsw = new FileSystemWatcher();
fsw.Path = "D:\\文献"; //设置监控的文件目录
fsw.IncludeSubdirectories = true; //设置监控C盘目录下的所有子目录
fsw.Filter = "*.txt"; //设置监控文件的类型
fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
fsw.Created += new FileSystemEventHandler(fsw_Created); //绑定事件触发后处理数据的方法。
fsw.EnableRaisingEvents = true; //启动监控
while (true)
{

Thread.Sleep(5000);// 创建和控制线程,设置其优先级并获取其状态
}
void fsw_Created(object sender, FileSystemEventArgs e)
{

Console.SetCursorPosition(0, 1);
List<string> s = new List<string>();
s.Add(e.Name);

string newname = e.Name;
string str = "D:\\文献\\" + newname;
//string filename1 = newname;
int judgenumber = 1;
//try
//{
//定义一个开始时间
DateTime startTime = DateTime.Now;

//创建内存临时数据表来存储从文本文件中读取出来的数据
using (DataTable table = new DataTable())
{
//为数据表创建相对应的数据列
table.Columns.Add("进站车站编码", typeof(System.String));
table.Columns.Add("进站日期", typeof(System.String));
table.Columns.Add("进站时间", typeof(System.String));
table.Columns.Add("出站车站编码", typeof(System.String));
table.Columns.Add("出站日期", typeof(System.String));
table.Columns.Add("出站时间", typeof(System.String));
table.Columns.Add("清分日期", typeof(System.String));
table.Columns.Add("卡号", typeof(System.String));
table.Columns.Add("卡类型", typeof(System.String));
table.Columns.Add("交易代码", typeof(System.String));
table.Columns.Add("闸机号", typeof(System.String));
table.Columns.Add("数据更新时间", typeof(System.String));


//因为文件比较大,所有使用StreamReader的效率要比使用File.ReadLines高
while (true)
{
try
{
using (Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
if (stream != null)
break;
}
System.Threading.Thread.Sleep(50000);
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Output file {0} not yet ready ({1})", e.Name, ex.Message));
}

using (StreamReader sr = new StreamReader(new FileStream(e.Name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.Default))
{

while (!sr.EndOfStream)//获取一个值,该值指示当前的流位置是否在流结尾
{
DataRow dr = table.NewRow();//创建数据行

string readStr = sr.ReadLine();//读取一行数据
if (judgenumber > 1)//去掉标题行
{
string[] strs = readStr.Split(new char[] { '\t', '"' }, StringSplitOptions.RemoveEmptyEntries);//将读取的字符串按"制表符/t“和””“分割成数组
string a = strs[0];
string b = strs[1];
string c = strs[2];
string d = strs[3];
string m = strs[4];
string f = strs[5];
string g = strs[6];
string h = strs[7];
string n = strs[8];
string j = strs[9];
string k = strs[10];
string l = strs[11];


//往对应的 行中添加数据
dr["进站车站编码"] = a;
dr["进站日期"] = b;
dr["进站时间"] = c;
dr["出站车站编码"] = d;
dr["出站日期"] = m;
dr["出站时间"] = f;
dr["清分日期"] = g;
dr["卡号"] = h;
dr["卡类型"] = n;
dr["交易代码"] = j;
dr["闸机号"] = k;
dr["数据更新时间"] = l;
table.Rows.Add(dr);//将创建的数据行添加到table中

}
judgenumber = judgenumber + 1; //if(judgenumber==16)
}

sr.Close();
sr.Dispose();



}


string connStr = "Data Source = orcl; Persist Security Info = True; User ID = noistest; Password = noistest";

OracleConnection conn = new OracleConnection(connStr);
OracleBulkCopy bulkCopy = new OracleBulkCopy(connStr, OracleBulkCopyOptions.UseInternalTransaction); //用其它源的数据有效批量加载Oracle表中
//conn.BeginTransaction();
//OracleBulkCopy bulkCopy = new OracleBulkCopy(connOrcleString, OracleBulkCopyOptions.Default);
bulkCopy.BatchSize = 100000;
bulkCopy.BulkCopyTimeout = 260;
bulkCopy.DestinationTableName = "AFC"; //服务器上目标表的名称
bulkCopy.BatchSize = table.Rows.Count; //每一批次中的行数
try
{
conn.Open();
if (table != null && table.Rows.Count != 0)

bulkCopy.WriteToServer(table); //将提供的数据源中的所有行复制到目标表中
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();

//

if (bulkCopy != null)
bulkCopy.Close();

}



}


}

Console.WriteLine(e.Name + "正在进行");

}

...全文
508 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大然然 2018-03-20
  • 打赏
  • 举报
回复
你监控的文件夹是d盘, 但你报错的文件确实c盘
全栈极简 2018-03-14
  • 打赏
  • 举报
回复
file没有找到,建议先判断一下File.Exists(),再执行。
  • 打赏
  • 举报
回复
你debug看有没有到sr.Close();方法
Jason_Mao1 2018-03-14
  • 打赏
  • 举报
回复
这个提示好像很明显啊 ,提示找不到啊 。建议你用英文文件命名,不要带乱七八糟特殊符号、用英文或者数字都可以 。希望能帮助到你 。
xuzuning 2018-03-14
  • 打赏
  • 举报
回复
出现共享异常时,尝试重新打开多次 看样子文件是自己的,那么可指定共享方式
zzzj-ovo 2018-03-14
  • 打赏
  • 举报
回复
下面读数据写错了,放在while外面就行了
书籍目录: 第1篇 Visual C#基础编程实例 实例1 C#经典程序--Hello World 实例2 C#的简单输入输出(I/O) 实例3 C#的复杂输入输出(I/O) 实例4 通信录管理与维护 实例5 文件与目录管理 实例6 用户界面上的“Hello,World!” 实例7 组件化“Welcome”程序 实例8 网络上的“Hello World” 实例9 Ref、Out与Params描述符的应用 实例10 C#自动内存管理的应用 实例11 一个有趣栈的实现 实例12 垃圾收集器管理与应用 实例13 垃圾收集器算法控制与使用 实例14 调用栈记录异常点 实例15 使用C#异常的栈跟踪 实例16 运行期间检测变量型 实例17 常用值型的原型定义 实例18 打印杨辉三角形 实例19 比较学生信息 实例20 获取车辆信息 实例21 简单角色游戏的制作 实例22 旅馆住宿登记情况表制作 实例23 长命名空间的应用 实例24 文件特征计数 实例25 文本框输入数据的验证 第2篇 Visual C#级编程实例 实例26 窗体背景颜色动态变化 实例27 C#属性及应用 实例28 C#属性Metadata的管理与应用 实例29 使用Context属性创建CallThreshold Service 实例30 使用应用程序域 实例31 创建C#组件与客户应用程序 实例32 用OpenFileDialog浏览或打开文件 实例33 在C#程序获得Win32 API 实例34 从C#调用COM组件 实例35 在C#程序修改HTML文件标题 实例36 下载Web页面 实例37 创建多线程应用程序 实例38 多线程的多次加载 实例39 单个线程同步运行 实例40 多线程同步运行 实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 实例46 防止多线程应用程序死锁 实例47 文件同步操作与应用 实例48 在COM程序设计使用.NET组件 实例49 文件异步操作与多处理器系统 实例50 获取网络主机IP地址 实例51 C#对话信息框的应用 实例52 在C#快速调用Windows API 实例53 摄氏温度与华氏温度间相互转换(1) 实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher组件监视Web服务器 实例56 由颜色名字产生对应颜色 实例57 使用索引指示器分析域名 实例58 C#版本的PingC 实例59 DNS客户程序 实例60 一个有趣的DOS实用程序 实例61 代表元基本应用 实例62 有趣的事件代表元 实例63 随机连续偶数发生事件处理 实例64 有趣的列表框窗体 实例65 数学函数应用 第3篇 Visual C#高级编程实例 实例66 文件文件列表 实例67 读写文本文件 实例68 读写二进制文件 实例69 显示系统日期与时间(1) 实例70 显示差值的日期与时间(2) 实例71 时钟发生器应用 实例72 在.NET程序设计使用ATL 实例73 浏览Internet文件 实例74 在C#应用程序打开浏览器 实例75 显示Internet文件信息 实例76 Puzzle游戏 实例77 MDI窗体菜单设计(1) 实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒器(Meal Reminder) 实例84 服务器端C#实例 实例85 数字时钟设计技术 实例86 自动编译C#程序AutoCompiler 实例87 使用C#与ASP+编写File Uploder 实例88 访问注册表的硬件信息 实例89 设置“开始”菜单 实例90 在“新建”添加自己的文件型 实例91 显示Exchange软件的客户名称 实例92 读取Windows注册表信息 实例93 自定义AboutBox组件 实例94 自定义控件及应用 实例95 Java与C#混合编程的应用 实例96 C#与C++混合编程的应用 实例97 C#与VB混合编程的应用 实例98 C#组件与C#客户程序编程的应用 实例99 C#与XML联合应用XMLHelper 实例100 在C#部署应用
第1篇 Visual C#基础编程实例
实例1 C#经典程序--Hello World
实例2 C#的简单输入输出(I/O)
实例3 C#的复杂输入输出(I/O)
实例4 通信录管理与维护
实例5 文件与目录管理
实例6 用户界面上的“Hello,World!”
实例7 组件化“Welcome”程序
实例8 网络上的“Hello World”
实例9 Ref、Out与Params描述符的应用
实例10 C#自动内存管理的应用
实例11 一个有趣栈的实现
实例12 垃圾收集器管理与应用
实例13 垃圾收集器算法控制与使用
实例14 调用栈记录异常
实例15 使用C#异常的栈跟踪
实例16 运行期间检测变量
实例17 常用值型的原型定义
实例18 打印杨辉三角形
实例19 比较学生信息
实例20 获取车辆信息
实例21 简单角色游戏的制作
实例22 旅馆住宿登记情况表制作
实例23 长命名空间的应用
实例24 文件特征计数
实例25 文本框输入数据的验证

第2篇 Visual C#级编程实例
实例26 窗体背景颜色动态变化
实例27 C#属性及应用
实例28 C#属性Metadata的管理与应用
实例29 使用Context属性创建CallThreshold Service
实例30 使用应用程序域
实例31 创建C#组件与客户应用程序
实例32 用OpenFileDialog浏览或打开文件
实例33 在C#程序获得Win32 API
实例34 从C#调用COM组件
实例35 在C#程序修改HTML文件标题
实例36 下载Web页面
实例37 创建多线程应用程序
实例38 多线程的多次加载
实例39 单个线程同步运行
实例40 多线程同步运行
实例41 线程Thread Relative Static跟踪与实现
实例42 线程池(ThreadPool)的应用
实例43 多线程互斥运行
实例44 多线程时钟应用程序
实例45 监视多线程
实例46 防止多线程应用程序死锁
实例47 文件同步操作与应用
实例48 在COM程序设计使用.NET组件
实例49 文件异步操作与多处理器系统
实例50 获取网络主机IP地址
实例51 C#对话信息框的应用
实例52 在C#快速调用Windows API
实例53 摄氏温度与华氏温度间相互转换(1)
实例54 摄氏温度与华氏温度间相互转换(2)
实例55 使用FileSystemWatcher组件监视Web服务器
实例56 由颜色名字产生对应颜色
实例57 使用索引指示器分析域名
实例58 C#版本的PingC
实例59 DNS客户程序
实例60 一个有趣的DOS实用程序
实例61 代表元基本应用
实例62 有趣的事件代表元
实例63 随机连续偶数发生事件处理
实例64 有趣的列表框窗体
实例65 数学函数应用

第3篇 Visual C#高级编程实例
实例66 文件文件列表
实例67 读写文本文件
实例68 读写二进制文件
实例69 显示系统日期与时间(1)
实例70 显示差值的日期与时间(2)
实例71 时钟发生器应用
实例72 在.NET程序设计使用ATL
实例73 浏览Internet文件
实例74 在C#应用程序打开浏览器
实例75 显示Internet文件信息
实例76 Puzzle游戏
实例77 MDI窗体菜单设计(1)
实例78 MDI窗体菜单设计(2)
实例79 创建一个C#编辑器
实例80 网络端口扫描器
实例81 深入WinForms-地址簿应用(1)
实例82 深入WinForms--Image Viewer应用程序(2)
实例83 开饭时间提醒器(Meal Reminder)
实例84 服务器端C#实例
实例85 数字时钟设计技术
实例86 自动编译C#程序AutoCompiler
实例87 使用C#与ASP+编写File Uploder
实例88 访问注册表的硬件信息
实例89 设置“开始”菜单
实例90 在“新建”添加自己的文件
实例91 显示Exchange软件的客户名称
实例92 读取Windows注册表信息
实例93 自定义AboutBox组件
实例94 自定义控件及应用
实例95 Java与C#混合编程的应用
实例96 C#与C++混合编程的应用
实例97 C#与VB混合编程的应用
实例98 C#组件与C#客户程序编程的应用
实例99 C#与XML联合应用XMLHelper
实例100 在C#部署应用程序 附录 WinCV 参考文献
第1篇 Visual C#基础编程实例
实例1 C#经典程序--Hello World
实例2 C#的简单输入输出(I/O)
实例3 C#的复杂输入输出(I/O)
实例4 通信录管理与维护
实例5 文件与目录管理
实例6 用户界面上的“Hello,World!”
实例7 组件化“Welcome”程序
实例8 网络上的“Hello World”
实例9 Ref、Out与Params描述符的应用
实例10 C#自动内存管理的应用
实例11 一个有趣栈的实现
实例12 垃圾收集器管理与应用
实例13 垃圾收集器算法控制与使用
实例14 调用栈记录异常
实例15 使用C#异常的栈跟踪
实例16 运行期间检测变量
实例17 常用值型的原型定义
实例18 打印杨辉三角形
实例19 比较学生信息
实例20 获取车辆信息
实例21 简单角色游戏的制作
实例22 旅馆住宿登记情况表制作
实例23 长命名空间的应用
实例24 文件特征计数
实例25 文本框输入数据的验证

第2篇 Visual C#级编程实例
实例26 窗体背景颜色动态变化
实例27 C#属性及应用
实例28 C#属性Metadata的管理与应用
实例29 使用Context属性创建CallThreshold Service
实例30 使用应用程序域
实例31 创建C#组件与客户应用程序
实例32 用OpenFileDialog浏览或打开文件
实例33 在C#程序获得Win32 API
实例34 从C#调用COM组件
实例35 在C#程序修改HTML文件标题
实例36 下载Web页面
实例37 创建多线程应用程序
实例38 多线程的多次加载
实例39 单个线程同步运行
实例40 多线程同步运行
实例41 线程Thread Relative Static跟踪与实现
实例42 线程池(ThreadPool)的应用
实例43 多线程互斥运行
实例44 多线程时钟应用程序
实例45 监视多线程
实例46 防止多线程应用程序死锁
实例47 文件同步操作与应用
实例48 在COM程序设计使用.NET组件
实例49 文件异步操作与多处理器系统
实例50 获取网络主机IP地址
实例51 C#对话信息框的应用
实例52 在C#快速调用Windows API
实例53 摄氏温度与华氏温度间相互转换(1)
实例54 摄氏温度与华氏温度间相互转换(2)
实例55 使用FileSystemWatcher组件监视Web服务器
实例56 由颜色名字产生对应颜色
实例57 使用索引指示器分析域名
实例58 C#版本的PingC
实例59 DNS客户程序
实例60 一个有趣的DOS实用程序
实例61 代表元基本应用
实例62 有趣的事件代表元
实例63 随机连续偶数发生事件处理
实例64 有趣的列表框窗体
实例65 数学函数应用

第3篇 Visual C#高级编程实例
实例66 文件文件列表
实例67 读写文本文件
实例68 读写二进制文件
实例69 显示系统日期与时间(1)
实例70 显示差值的日期与时间(2)
实例71 时钟发生器应用
实例72 在.NET程序设计使用ATL
实例73 浏览Internet文件
实例74 在C#应用程序打开浏览器
实例75 显示Internet文件信息
实例76 Puzzle游戏
实例77 MDI窗体菜单设计(1)
实例78 MDI窗体菜单设计(2)
实例79 创建一个C#编辑器
实例80 网络端口扫描器
实例81 深入WinForms-地址簿应用(1)
实例82 深入WinForms--Image Viewer应用程序(2)
实例83 开饭时间提醒器(Meal Reminder)
实例84 服务器端C#实例
实例85 数字时钟设计技术
实例86 自动编译C#程序AutoCompiler
实例87 使用C#与ASP+编写File Uploder
实例88 访问注册表的硬件信息
实例89 设置“开始”菜单
实例90 在“新建”添加自己的文件
实例91 显示Exchange软件的客户名称
实例92 读取Windows注册表信息
实例93 自定义AboutBox组件
实例94 自定义控件及应用
实例95 Java与C#混合编程的应用
实例96 C#与C++混合编程的应用
实例97 C#与VB混合编程的应用
实例98 C#组件与C#客户程序编程的应用
实例99 C#与XML联合应用XMLHelper

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧