C# FileSystemWatcher 监视磁盘文件
C# FileSystemWatcher 监视磁盘文件变更
简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库。
原需求:原先的需求是这样的:有一台PDA扫码枪,一个IP照相机放置在下线区传送带上方。当PDA扫描箱子上的条码,触发相机拍照,将图片流传至远端服务器,找到对应的条码,将图片存储并更新数据库。
然而我不知道PDA扫描的瞬间如何与IP相机通信(蓝牙或WLAN?),其实关键是我不知道怎样使用IP相机的外触发功能,增加蓝牙触发器?也不知道怎样hack或ssh到这个相机(应该是linux的吧),所以只能先使用简化需求的版本。
而简化需求的版本,关键就是监视文件夹内容变化与上传文件流。
昨天问了下度娘,C#中的监视组件名字叫做FileSystemWatcher。
于是写了个demo,可以监视所有逻辑盘或者某个文件夹。
使用方法:
1.直接打开是监视所有逻辑磁盘文件变化。

2.或者传递参数,监视某一路径文件变化。如图,监视e盘

源代码:

1 namespace FileSystemWatcherDemo
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 //watcher组
8 FileSystemWatcher[] watchers;
9
10 //若未传递参数,则监视所有文件系统,包括CD-ROM(不可用),可移动磁盘(不可用)等
11 if (args.Length == 0)
12 {
13 string[] drivers = Directory.GetLogicalDrives();
14 watchers = new FileSystemWatcher[drivers.Length];
15
16 for (int i = 0; i < drivers.Length; i++)
17 {
18 try
19 {
20 watchers[i] = new FileSystemWatcher { Path = drivers[i] };
21 }
22 catch (Exception ex)
23 {
24 Trace.TraceWarning(ex.Message);
25 }
26 }
27 }
28 else
29 {
30 watchers = new FileSystemWatcher[1];
31 watchers[0] = new FileSystemWatcher { Path = args[0] };
32 }
33
34 foreach (FileSystemWatcher w in watchers)
35 {
36 if (w == null) continue;
37
38 w.Filter = "*";
39 w.IncludeSubdirectories = true;
40 w.EnableRaisingEvents = true;
41
42 w.Created += onFileSystem_Changed;
43 w.Deleted += onFileSystem_Changed;
44 w.Changed += onFileSystem_Changed;
45 w.Renamed += watcher_Renamed;
46 }
47
48 Console.ReadLine();
49 }
50
51 #region [ 检测文件是否占用 ]
52 /// <summary>
53 /// 检测文件是否占用
54 /// </summary>
55 /// <param name="filename"></param>
56 /// <returns></returns>
57 static bool IsFileReady(string filename)
58 {
59 var fi = new FileInfo(filename);
60 FileStream fs = null;
61 try
62 {
63 fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.None);
64 return true;
65 }
66 catch (IOException)
67 {
68 return false;
69 }
70
71 finally
72 {
73 if (fs != null)
74 fs.Close();
75 }
76 }
77 #endregion
78
79 private static volatile object _lock = true;
80 static void onFileSystem_Changed(object sender, FileSystemEventArgs e)
81 {
82 lock (_lock)
83 {
84 Console.ForegroundColor = ConsoleColor.DarkGray;
85 Console.Write("[");
86 Console.Write(DateTime.Now.ToString("HH:mm:ss"));
87 Console.Write("] ");
88
89 switch (e.ChangeType.ToString().ToLower())
90 {
91 case "created":
92 //while (!IsFileReady(e.FullPath))
93 //{
94 // if (!File.Exists(e.FullPath))
95 // return;
96 // Thread.Sleep(100);
97 //}
98 Console.ForegroundColor = ConsoleColor.Green;
99 Console.Write(e.ChangeType);
100 Console.ForegroundColor = ConsoleColor.White;
101 Console.Write(" ");
102 Console.Write(e.Name);
103 Console.Write(" ");
104 Console.ForegroundColor = ConsoleColor.DarkGray;
105 Console.Write(e.FullPath);
106
107 break;
108 case "deleted":
109 Console.ForegroundColor = ConsoleColor.Red;
110 Console.Write(e.ChangeType);
111 Console.ForegroundColor = ConsoleColor.White;
112 Console.Write(" ");
113 Console.Write(e.Name);
114 Console.Write(" ");
115 Console.ForegroundColor = ConsoleColor.DarkGray;
116 Console.Write(e.FullPath);
117 break;
118 case "changed":
119 Console.ForegroundColor = ConsoleColor.Cyan;
120 Console.Write(e.ChangeType);
121 Console.ForegroundColor = ConsoleColor.White;
122 Console.Write(" ");
123 Console.Write(e.Name);
124 Console.Write(" ");
125 Console.ForegroundColor = ConsoleColor.DarkGray;
126 Console.Write(e.FullPath);
127 break;
128 }
129
130 Console.Write("\r\n");
131 }
132 }
133 static void watcher_Renamed(object sender, RenamedEventArgs e)
134 {
135 Console.ForegroundColor = ConsoleColor.Magenta;
136 Console.Write(e.ChangeType);
137 Console.ForegroundColor = ConsoleColor.White;
138 Console.Write(" ");
139 Console.Write(e.OldName);
140 Console.Write(e.OldFullPath);
141 Console.ForegroundColor = ConsoleColor.Yellow;
142 Console.Write(" ");
143 Console.Write(e.Name);
144 Console.Write(e.FullPath);
145 Console.Write(Thread.CurrentThread.Name);
146 Console.Write("\r\n");
147 }
148 }
149 }

仍有bug,望高手指正。
附上编译好的exe,可以直接运行。
C# FileSystemWatcher 监视磁盘文件的更多相关文章
- C# FileSystemWatcher 监视磁盘文件变更
简化需求:有一个简化了的需求是这样的:有一个拍照程序在运行,一旦抓拍之后则将图片文件存储至某目录,然后图片要上传至远程服务器并update数据库. 原需求:原先的需求是这样的:有一台PDA扫码枪,一个 ...
- 使用FileSystemWatcher监视指定目录
使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录的更改. 以下是一个简单的实例,用来监控指定目录下文件的新增.删除.重命名等情况(文件内容更改会触发多次, ...
- FileSystemWatcher 监视指定目录中的变更
.Net框架类库中的FileSystemWatcher如它的名称一样是一个用于监视文件系统变化的一个控件.使用 FileSystemWatcher 监视指定目录中的更改.可监视指定目录中的文件或子目录 ...
- 使用FileSystemWatcher监视文件变化
本文转载:http://www.cnblogs.com/zanxiaofeng/archive/2011/01/08/1930583.html FileSystemWatcher基础 属性: Path ...
- 利用FileSystemWatcher实现磁盘文件监控
马上放假了,好开森啊O(∩_∩)O哈哈~ ——————————————————————————————————————————————————————— 昨天逛园子,发现了一个FileSystemWa ...
- C#使用FileSystemWatcher控件实现的文件监控功能示例
本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...
- 文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter
一.读写类: TextReader/TextWriter:文本读写,抽象类 TextReader,其派生类: StreamReader:以一种特定的编码从字节流中读取字符. StringReader: ...
- C#实现对文件目录的实时监控
本文主要描述如何通过C#实现实时监控文件目录下的变化,包括文件和目录的添加,删除,修改和重命名等操作. 首先,我们需要对.net提供的FileSystemWatcher类有所了解.我有些懒,找了MSD ...
- grunt打包过程中的注意点
1.安装nodeJS nodeJS下载地址: http://www.nodejs.org/download/ 2. 在Node.js command prompt 这个控制面板输入 npm i ...
随机推荐
- MEF初体验之五:Lazy Exports
在一个部件组合中,导入将触发一个部件或者多个部件的实例化,这些部件暴露了所需原请求部件的必要的导入.对于一些应用程序来说,延迟实例化-防止图结构下的递归组合-可能对于将创建一个长久复杂的开销很大而不必 ...
- JUnit实战(2) - JUnit核心(使用Suite来组合测试)
创建Java Project项目:ch02-internals MasterTestSuite.java package com.manning.junitbook.ch02.internals; i ...
- VS2013上利用InstallShield2013LimitedEdition/C#生成安装包
1.文件-新建项目-其它项目类型-安装和部署 一開始是没有InstallShield2013LimitedEdition这个软件的.你须要去站点上填写信息而且下载 2.填写信息下载 訪问站点:http ...
- Cache
在选择的几点思考
Cache为缓解DB装有重要数据,下面经常使用memcached和redis要总结,促进技术的选择. 1 memcached (1) 有限支持的操作,持经常使用的set.get.delete和过期删 ...
- UVA662- Fast Food
题意:在一条公路上,有n个酒店,要建造k个供给站(建造在酒店所在的位置),给出酒店的位置,求怎么样建造供给站才干使得每一个酒店都能得到服务且所要走的路程最短. 思路:在i到j酒店建立一个供给站,要使得 ...
- Cocos2d-x3.3它DrawPrimitivesTest分析
1.代码列表 2.VisibleRect类 该类是test-cpp自带工具类 3.HelloWorldScene类 同前面代码 4.DrawPrimitivesDemo类 1).h文件 #includ ...
- WIN8 、WIN7 下IIS7.5、IIS8 的rewrite 伪静态功能设置方法
原文 WIN8 .WIN7 下IIS7.5.IIS8 的rewrite 伪静态功能设置方法 win7和win8系统都自带有iis的功能.关于IIS的安装,上一篇已经讲述,这里就不重复了. 下面说下在w ...
- PYTHON单元测试
PYTHON开发入门与实战11-单元测试 1. 单元测试 本章节我们来讲讲django工程中如何实现单元测试,单元测试如何编写以及在可持续项目中单元测试的重要性. 下面是单元测试的定义: 单元测试是开 ...
- 初学git && 使用总结
参考文章:http://www.ruanyifeng.com/blog/2014/06/git_remote.html git基础操作 http://www.ruanyifeng.com/blog ...
- js中frame的操作问题
这里以图为例,在这里把frame之间的互相操作简单列为:1变量2方法3页面之间元素的互相获取. A 首先从 父(frameABC)------->子(frameA,frameB,frameC) ...