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 ...
随机推荐
- Java使用串行编程操作继电器
首先,我们必须建立一个良好的环境,那是,jdk并且tomcat.如果它不必须是web装了! 还有就是配置,也就是默认的comm.jar ,javax.comm.properties , win32co ...
- Android处理延迟加载的方法
在项目开发,通过延时载入来实现满足我们的项目要求.那究竟如何来实现延时.以下结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style=&quo ...
- java通过抛异常来返回提示信息
结论:如果把通过抛异常的方式得到提示信息,可以使用java.lang.Throwable中的构造函数: public Throwable(String message) { fillInStackTr ...
- Mac周边环境 goBASIC语言HelloWorld
1. 安装mercurial Mercurial 是一种轻量级分布式版本号控制系统,採用 Python 语言实现 能够输入hg命令查询系统是否安装mercurial,能够例如以下两种命令安装 $sud ...
- 解决 Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat
在配置 mybatis mapper.xml文件时, 一不小心就会报如下类似的异常: Caused by: org.springframework.beans.factory.BeanCreation ...
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- hdu 1316 How Many Fibs? (模拟高精度)
题目大意: 问[s,e]之间有多少个 斐波那契数. 思路分析: 直接模拟高精度字符串的加法和大小的比較. 注意wa点再 s 能够从 0 開始 那么要在推断输入结束的时候注意一下. #include & ...
- SVN和Git的一些用法总结(转)
转载请注明出处:http://www.codelast.com/ 以下都是比较基础的操作,高手们请绕道,不必浪费时间来看了. (A)SVN (1)查看日志提交的时候一般会写上注释,如果要查看提交日志, ...
- Codeforces 443 B. Kolya and Tandem Repeat
纯粹练JAVA.... B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megab ...
- [JavaScript权威指南 [笔记]
对象的比较均是引用的比较.(不可变的原始值和可变的对象引用)this返回调用这个方法的对象通过x!==x来判断x是否为NaNvar max = max_width || preferences.max ...