C#采用FileSystemWatcher实现监视磁盘文件变更的方法
本文实例讲述了C#采用FileSystemWatcher实现监视磁盘文件变更的方法。分享给大家供大家参考。具体实现方法如下:
简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库。
原需求:原先的需求是这样的:有一台PDA扫码枪,一个IP照相机放置在下线区传送带上方。当PDA扫描箱子上的条码,触发相机拍照,将图片流传至远端服务器,找到对应的条码,将图片存储并更新数据库。
然而我不知道PDA扫描的瞬间如何与IP相机通信(蓝牙或WLAN?),其实关键是我不知道怎样使用IP相机的外触发功能,增加蓝牙触发器?也不知道怎样hack或ssh到这个相机(应该是linux的吧),所以只能先使用简化需求的版本。
而简化需求的版本,关键就是监视文件夹内容变化与上传文件流。
昨天问了下度娘,C#中的监视组件名字叫做FileSystemWatcher。
于是写了个demo,可以监视所有逻辑盘或者某个文件夹。
使用方法:
1.直接打开是监视所有逻辑磁盘文件变化。
2.或者传递参数,监视某一路径文件变化。如图,监视e盘
源代码如下:
namespaceFileSystemWatcherDemo
{
classProgram
{
staticvoidMain(string[]args)
{
//watcher组
FileSystemWatcher[]watchers;
//若未传递参数,则监视所有文件系统,包括CD-ROM(不可用),可移动磁盘(不可用)等
if(args.Length==0)
{
string[]drivers=Directory.GetLogicalDrives();
watchers=newFileSystemWatcher[drivers.Length];
for(inti=0;i<drivers.Length;i++)
{
try
{
watchers[i]=newFileSystemWatcher{Path=drivers[i]};
}
catch(Exceptionex)
{
Trace.TraceWarning(ex.Message);
}
}
}
else
{
watchers=newFileSystemWatcher[1];
watchers[0]=newFileSystemWatcher{Path=args[0]};
}
foreach(FileSystemWatcherwinwatchers)
{
if(w==null)continue;
w.Filter="*";
w.IncludeSubdirectories=true;
w.EnableRaisingEvents=true;
w.Created+=onFileSystem_Changed;
w.Deleted+=onFileSystem_Changed;
w.Changed+=onFileSystem_Changed;
w.Renamed+=watcher_Renamed;
}
Console.ReadLine();
}
#region[检测文件是否占用]
///<summary>
///检测文件是否占用
///</summary>
///<paramname="filename"></param>
///<returns></returns>
staticboolIsFileReady(stringfilename)
{
varfi=newFileInfo(filename);
FileStreamfs=null;
try
{
fs=fi.Open(FileMode.Open,FileAccess.Read,FileShare.None);
returntrue;
}
catch(IOException)
{
returnfalse;
}
finally
{
if(fs!=null)
fs.Close();
}
}
#endregion
privatestaticvolatileobject_lock=true;
staticvoidonFileSystem_Changed(objectsender,FileSystemEventArgse)
{
lock(_lock)
{
Console.ForegroundColor=ConsoleColor.DarkGray;
Console.Write("[");
Console.Write(DateTime.Now.ToString("HH:mm:ss"));
Console.Write("]");
switch(e.ChangeType.ToString().ToLower())
{
case"created":
//while(!IsFileReady(e.FullPath))
//{
// if(!File.Exists(e.FullPath))
// return;
// Thread.Sleep(100);
//}
Console.ForegroundColor=ConsoleColor.Green;
Console.Write(e.ChangeType);
Console.ForegroundColor=ConsoleColor.White;
Console.Write("");
Console.Write(e.Name);
Console.Write("");
Console.ForegroundColor=ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
case"deleted":
Console.ForegroundColor=ConsoleColor.Red;
Console.Write(e.ChangeType);
Console.ForegroundColor=ConsoleColor.White;
Console.Write("");
Console.Write(e.Name);
Console.Write("");
Console.ForegroundColor=ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
case"changed":
Console.ForegroundColor=ConsoleColor.Cyan;
Console.Write(e.ChangeType);
Console.ForegroundColor=ConsoleColor.White;
Console.Write("");
Console.Write(e.Name);
Console.Write("");
Console.ForegroundColor=ConsoleColor.DarkGray;
Console.Write(e.FullPath);
break;
}
Console.Write("\r\n");
}
}
staticvoidwatcher_Renamed(objectsender,RenamedEventArgse)
{
Console.ForegroundColor=ConsoleColor.Magenta;
Console.Write(e.ChangeType);
Console.ForegroundColor=ConsoleColor.White;
Console.Write("");
Console.Write(e.OldName);
Console.Write(e.OldFullPath);
Console.ForegroundColor=ConsoleColor.Yellow;
Console.Write("");
Console.Write(e.Name);
Console.Write(e.FullPath);
Console.Write(Thread.CurrentThread.Name);
Console.Write("\r\n");
}
}
}
希望本文所述对大家的C#程序设计有所帮助。
相关文章
- C#操作INI文件的案例分享
- c# 多线程并发-金三银四面试:C#.NET面试题高级篇2-多线程
- C# 读取EXCEL文件的三种经典方法详解编程语言
- 比较有效的使用C#读取文件的代码
- C#文件上传默认最大为4M的解决方法
- C#中执行批处理文件(*.bat)的方法代码
- c#解压文件的实例方法
- C#操作目录与文件的方法步骤
- C#实现Web文件上传的两种方法实例代码
- C#调用Matlab生成的dll方法的详细说明
- C#Js时间格式化问题简单实例
- C#获取全部目录和文件的简单实例
- C#文件操作的简单实例
- c#正反序列化XML文件示例(xml序列化)
- c#文件的I/O基本操作
- C#中Html.RenderPartial与Html.RenderAction的区别分析
- C#中winform使用相对路径读取文件的方法
- C#读取二进制文件方法分析
- C#的FileInfo类实现文件操作实例
- C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法
- C#WinForm编程获取文件物理路径的方法
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- C#将Sql数据保存到Excel文件中的方法
- C#使用iCSharpcode进行文件压缩实现方法